[Python-de] IP Ranges testen: if ip in range

Tino Lange tl_news at nexgo.de
Tue Jun 18 23:44:38 EDT 2002


Am 18 Jun 2002 um 21:20 hat Gerhard Häring geschrieben:

> Man muss halt ein wenig Bitklauberei betreiben, wenn man es
> selber macht. Hier ein Schnellschuss von mir, der vielleicht noch den
> einen oder anderen Fehler enthält:

Danke Gerhard!

Ich habe mit Deinem Ansatz und dem inzwischenen gefundenen Rezept:
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66517
(im folgenden Modul "IPConversions") was Nettes zusammengebastelt:

----------- snip ----------
#! /usr/bin/env python

import string, IPConversions, socket

class IPRangeError(Exception):
    def __init__(self, value):
        self.value = value
    def __str__(self):
        return `self.value`
    
class IPRange:
    def __init__(self, startip, stopip = None):
        if stopip == None:
            try:
                startip, slashrange = string.split(startip, "/")
            except ValueError:
                raise IPRangeError("No stopip and no '/xx' range given!")
            slashrange=int(slashrange)
            if not (0 < slashrange <= 32):
                raise IPRangeError("The 'slashrange' /xx should be between 1 and 32!")
            self.startip = IPConversions.dottedQuadToNum(startip) & IPConversions.makeMask(slashrange)
            self.stopip = IPConversions.dottedQuadToNum(startip) | (2L**32-1 - 
IPConversions.makeMask(slashrange))
        else:
            self.startip = IPConversions.dottedQuadToNum(startip)
            self.stopip = IPConversions.dottedQuadToNum(stopip)
        #if self.startip > self.stopip:
        #    raise IPRangeError("'startip' should be < than 'stopip'")
        
    def contains(self, testip):
        return (self.startip <= IPConversions.dottedQuadToNum(testip) <= self.stopip)

    def __str__(self):
        return "IPRange: %s - %s" % (IPConversions.numToDottedQuad(self.startip), 
IPConversions.numToDottedQuad(self.stopip))

----------- snip ----------

So klappt das prima! Sowohl mit range=IPRange("startip", "stopip") und mit range=IPRange("startip/xx")

> Außentemperatur in München: 27.4 °C      Wind: 1.9 m/s
Nur 27,4???
Wir haben immer noch 32 Grad (Ffm Innenstadt...)

Tschö und nochmal danke

Tino




More information about the Python-de mailing list