Skip to main content

Class and tools for handling of IPv4 and IPv6 addresses and networks

Project description

IPy - class and tools for handling of IPv4 and IPv6 addresses and networks.

Website: https://github.com/haypo/python-ipy/

Presentation of the API

The IP class allows a comfortable parsing and handling for most notations in use for IPv4 and IPv6 addresses and networks. It was greatly inspired by RIPE’s Perl module NET::IP’s interface but doesn’t share the implementation. It doesn’t share non-CIDR netmasks, so funky stuff like a netmask of 0xffffff0f can’t be done here.

>>> from IPy import IP
>>> ip = IP('127.0.0.0/30')
>>> for x in ip:
...  print(x)
...
127.0.0.0
127.0.0.1
127.0.0.2
127.0.0.3
>>> ip2 = IP('0x7f000000/30')
>>> ip == ip2
1
>>> ip.reverseNames()
['0.0.0.127.in-addr.arpa.', '1.0.0.127.in-addr.arpa.', '2.0.0.127.in-addr.arpa.', '3.0.0.127.in-addr.arpa.']
>>> ip.reverseName()
'0-3.0.0.127.in-addr.arpa.'
>>> ip.iptype()
'PRIVATE'

Supports most IP address formats

It can detect about a dozen different ways of expressing IP addresses and networks, parse them and distinguish between IPv4 and IPv6 addresses:

>>> IP('10.0.0.0/8').version()
4
>>> IP('::1').version()
6

IPv4 addresses

>>> print(IP(0x7f000001))
127.0.0.1
>>> print(IP('0x7f000001'))
127.0.0.1
>>> print(IP('127.0.0.1'))
127.0.0.1
>>> print(IP('10'))
10.0.0.0

IPv6 addresses

>>> print(IP('1080:0:0:0:8:800:200C:417A'))
1080::8:800:200c:417a
>>> print(IP('1080::8:800:200C:417A'))
1080::8:800:200c:417a
>>> print(IP('::1'))
::1
>>> print(IP('::13.1.68.3'))
::d01:4403

Network mask and prefixes

>>> print(IP('127.0.0.0/8'))
127.0.0.0/8
>>> print(IP('127.0.0.0/255.0.0.0'))
127.0.0.0/8
>>> print(IP('127.0.0.0-127.255.255.255'))
127.0.0.0/8

Derive network address

IPy can transform an IP address into a network address by applying the given netmask: >>> print(IP(‘127.0.0.1/255.0.0.0’, make_net=True)) 127.0.0.0/8

This can also be done for existing IP instances: >>> print(IP(‘127.0.0.1’).make_net(‘255.0.0.0’)) 127.0.0.0/8

Convert address to string

Nearly all class methods which return a string have an optional parameter ‘wantprefixlen’ which controls if the prefixlen or netmask is printed. Per default the prefilen is always shown if the network contains more than one address:

wantprefixlen == 0 / None     don't return anything   1.2.3.0
wantprefixlen == 1            /prefix                 1.2.3.0/24
wantprefixlen == 2            /netmask                1.2.3.0/255.255.255.0
wantprefixlen == 3            -lastip                 1.2.3.0-1.2.3.255

You can also change the defaults on an per-object basis by fiddling with the class members:

  • NoPrefixForSingleIp

  • WantPrefixLen

Examples of string conversions:

>>> IP('10.0.0.0/32').strNormal()
'10.0.0.0'
>>> IP('10.0.0.0/24').strNormal()
'10.0.0.0/24'
>>> IP('10.0.0.0/24').strNormal(0)
'10.0.0.0'
>>> IP('10.0.0.0/24').strNormal(1)
'10.0.0.0/24'
>>> IP('10.0.0.0/24').strNormal(2)
'10.0.0.0/255.255.255.0'
>>> IP('10.0.0.0/24').strNormal(3)
'10.0.0.0-10.0.0.255'
>>> ip = IP('10.0.0.0')
>>> print(ip)
10.0.0.0
>>> ip.NoPrefixForSingleIp = None
>>> print(ip)
10.0.0.0/32
>>> ip.WantPrefixLen = 3
>>> print(ip)
10.0.0.0-10.0.0.0

TODO

  • better comparison (__cmp__ and friends)

  • tests for __cmp__

  • always write hex values lowercase

  • interpret 2001:1234:5678:1234/64 as 2001:1234:5678:1234::/64

  • move size in bits into class variables to get rid of some “if self._ipversion …”

  • support for base85 encoding

  • support for output of IPv6 encoded IPv4 Addresses

  • update address type tables

  • first-last notation should be allowed for IPv6

  • add IPv6 docstring examples

  • check better for negative parameters

  • add addition / aggregation

  • move reverse name stuff out of the classes and refactor it

  • support for aggregation of more than two nets at once

  • support for aggregation with “holes”

  • support for finding common prefix

  • ‘>>’ and ‘<<’ for prefix manipulation

  • add our own exceptions instead ValueError all the time

  • rename checkPrefix to checkPrefixOk

  • add more documentation and doctests

  • refactor

What’s new

Version 0.75 (2011-04-12)

  • IP(‘::/0’).netmask() gives IP(‘::’) instead of IP(‘0.0.0.0’)

Version 0.74 (2011-02-16)

  • Fix tests for Python 3.1 and 3.2

  • ip.__nonzero__() and (ipa in ipb) return a bool instead of 0 or 1

  • IP(‘0.0.0.0/0’) + IP(‘0.0.0.0/0’) raises an error, fix written by Arfrever

Version 0.73 (2011-02-15)

  • Support Python 3: setup.py runs 2to3

  • Update the ranges for IPv6 IPs

  • Fix reverseName() and reverseNames() for IPv4 in IPv6 addresses

  • Drop support of Python < 2.5

Version 0.72 (2010-11-23)

  • Include examples and MANIFEST.in in source build (add them to MANIFEST.in)

  • Remove __rcsid__ constant from IPy module

Version 0.71 (2010-10-01)

  • Use xrange() instead of range()

  • Use isinstance(x, int) instead of type(x) == types.IntType

  • Prepare support of Python3 (use integer division: x // y)

  • Fix IP(long) constructor: ensure that the address is not too large

  • Constructor raise a TypeError if the type is not int, long, str or unicode

  • 223.0.0.0/8 is now public (belongs to APNIC)

Version 0.70 (2009-10-29)

  • New “major” version because it may break compatibility

  • Fix __cmp__(): IP(‘0.0.0.0/0’) and IP(‘0.0.0.0’) are not equal

  • Fix IP.net() of the network “::/0”: “::” instead of “0.0.0.0”. IPy 0.63 should fix this bug, but it wasn’t.

Version 0.64 (2009-08-19)

  • Create MANIFEST.in to fix setup.py bdist_rpm, fix by Robert Nickel

Version 0.63 (2009-06-23)

  • Fix formatting of “IPv4 in IPv6” network, eg. IP(‘::ffff:192.168.10.0/120’), the netmask (“/120” in the example) was missing!

Version 0.62 (2008-07-15)

  • Fix reverse DNS of IPv6 address: use “.ip6.arpa.” suffix instead of deprecated “.ip6.int.” suffix

Version 0.61 (2008-06-12)

  • Patch from Aras Vaichas allowing the [-1] operator to work with an IP object of size 1.

Version 0.60 (2008-05-16)

  • strCompressed() formats ‘::ffff:a.b.c.d’ correctly

  • Use strCompressed() instead of strFullsize() to format IP addresses, ouput is smarter with IPv6 address

  • Remove check_addr_prefixlen because it generates invalid IP address

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

IPy-0.75.tar.gz (28.5 kB view details)

Uploaded Source

File details

Details for the file IPy-0.75.tar.gz.

File metadata

  • Download URL: IPy-0.75.tar.gz
  • Upload date:
  • Size: 28.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for IPy-0.75.tar.gz
Algorithm Hash digest
SHA256 0fa14af4792cc0b6f61cb5a1cd8fbdf7ddbaa6864ef82681021b750e9e6b2b61
MD5 d56716a3d8c77fe8539b6e90c88010bd
BLAKE2b-256 1e88b5a29c13e55c71d2a133d0dd17f65565b9bc500fa61d8a49f47098c26bec

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page