diff --git a/cymru/core/cache.py b/cymru/core/cache.py index 3e9bf0d..1fed34d 100644 --- a/cymru/core/cache.py +++ b/cymru/core/cache.py @@ -47,11 +47,12 @@ def get_cached(self, values, qType): # create keys based on prefix + svcname + qType + qvalue keys = [self.KEY_FMT % (self.svcName,qType,value) for value in values] prefixlen=len(self.KEY_FMT % (self.svcName,qType,'')) - log.debug('get_cached prefixlen %d'%(prefixlen) ) + log.debug('get_cached prefixlen %d / %s'%(prefixlen,self.KEY_FMT % (self.svcName,qType,value)) ) # look in local dict if not HAVE_MEMCACHE: vals=dict() for k in keys: + log.debug('get_cached looking for key %s'%(k) ) if ( k in self.c): vals[k] = self.c[k] log.debug('get_cached related vals in CACHE %s'%(vals) ) diff --git a/cymru/core/whois.py b/cymru/core/whois.py index 9de9680..63fad04 100644 --- a/cymru/core/whois.py +++ b/cymru/core/whois.py @@ -11,7 +11,6 @@ import errno import logging -import ADNS,adns import IPy import cache @@ -19,32 +18,6 @@ log = logging.getLogger('core.whois') - - -class recordIp: - def __init__(self, asn=None, ip=None, prefix=None, cc=None, lir=None, date=None, owner=None, info=None): - self.init(asn, ip, prefix, cc, lir, date, owner, info) - def init(self, asn=None, ip=None, prefix=None, cc=None, lir=None, date=None, owner=None, info=None): - def fix(x): - if x is None: - return None - x = x.strip() - if x == "NA": - return None - return str(x.decode('ascii','ignore')) - self.asn = fix(asn) - self.ip = fix(ip) - self.prefix = fix(prefix) - self.cc = fix(cc) - self.lir = fix(lir) - self.owner = fix(owner) - self.date = fix(date) - self.info = fix(info) - def __repr__(self): - return "<%s instance: asn:%s|ip:%s|prefix:%s|cc:%s|lir:%s|date:%s|owner:%s>" \ - % (self.__class__, self.asn, self.ip, self.prefix, self.cc, self.lir, self.date,self.owner) - - class WhoisClient(): '''Whois light client for Cymru Whois server.''' QTYPES=[None] @@ -95,6 +68,7 @@ def lookupmany(self, values, qType=None): qType=self.QTYPES[0] # clean values and type IP values values = [str(value).strip() for value in values] + log.debug("values :%s" % (values)) if qType in ['IP','IP6']: values = [IPy.IP(value).strNormal() for value in values] #go @@ -155,34 +129,7 @@ def _getCB(self,qType): resolveCallback : DNS response callback ( def _asyncResolve( self, answer, qname, rr, flags, extra) ) ''' - #raise NotImplementedError() - #return None,None - return self.buildRequest,self.buildRecordOrigin - - def buildRequest(self,values): - vstring='\r\n'.join(values) - vstring='begin\r\nverbose\r\n'+vstring+'\r\nend\r\n' - return vstring - - def buildRecordOrigin(self,response): - return self.buildRecords(response,recordIp,1,'IP') - - def buildRecords(self,response,recordMaker,ind,qType): - lines=response.split('\n') - log.debug('lines : %s'%(lines)) - records=[] - for line in lines[1:-1]: - columns=[col.strip() for col in line.split('|')] - log.debug('columns %s'%(columns)) - r=recordMaker(*columns) - log.debug('caching : %s'%(r)) - self.cache.cache(columns[ind],r,qType) - records.append(r) - return records - - - - + raise NotImplementedError() @@ -206,9 +153,4 @@ def iterwindow(l, slice=50): if __name__ == "__main__": logging.basicConfig(level=logging.INFO) - #testOrigin() - #testOrigin6() - #testASN() - #testPeer() - lookup_stdin() diff --git a/cymru/ip2asn/whois.py b/cymru/ip2asn/whois.py new file mode 100644 index 0000000..41ae0ef --- /dev/null +++ b/cymru/ip2asn/whois.py @@ -0,0 +1,124 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright (C) 2011 Loic Jaquemet loic.jaquemet+cymru@gmail.com +# +# +# This module is released under the GPL v3 License: +# http://www.opensource.org/licenses/gpl-3.0 + +import socket +import errno +import logging + +import IPy + +from ..core.whois import WhoisClient as WhoisCoreClient + +log = logging.getLogger('ip2asn.whois') + + + + +class recordIp: + def __init__(self, asn=None, ip=None, prefix=None, cc=None, lir=None, date=None, owner=None, info=None): + self.init(asn, ip, prefix, cc, lir, date, owner, info) + def init(self, asn=None, ip=None, prefix=None, cc=None, lir=None, date=None, owner=None, info=None): + def fix(x): + if x is None: + return None + x = x.strip() + if x == "NA": + return None + return str(x.decode('ascii','ignore')) + self.asn = fix(asn) + self.ip = fix(ip) + self.prefix = fix(prefix) + self.cc = fix(cc) + self.lir = fix(lir) + self.owner = fix(owner) + self.date = fix(date) + self.info = fix(info) + def __repr__(self): + return "<%s instance: asn:%s|ip:%s|prefix:%s|cc:%s|lir:%s|date:%s|owner:%s>" \ + % (self.__class__, self.asn, self.ip, self.prefix, self.cc, self.lir, self.date,self.owner) + + +class WhoisClient(WhoisCoreClient): + '''Whois light client for Cymru Whois server.''' + QTYPES=['IP','IP6','AS'] + client = None + cache = None + def __init__(self,server='whois.cymru.com',port=43,memcache_host='localhost:11211'): + WhoisCoreClient.__init__(self,'ip2asn',server,port,memcache_host) + + def _getCB(self,qType): + if qType == 'IP': + return self.buildRequest,self.buildRecordOrigin + elif qType == 'IP6': + return self.buildRequest,self.buildRecordOrigin6 + else: + pass + + def buildRequest(self,values): + vstring='\r\n'.join(values) + vstring='begin\r\nverbose\r\n'+vstring+'\r\nend\r\n' + return vstring + + def buildRecordOrigin(self,response): + return self.buildRecords(response,recordIp,1,'IP') + + def buildRecordOrigin6(self,response): + return self.buildRecords(response,recordIp,1,'IP6') + + def buildRecords(self,response,recordMaker,ind,qType): + lines=response.split('\n') + log.debug('lines : %s'%(lines)) + records=[] + for line in lines[1:-1]: + columns=[col.strip() for col in line.split('|')] + log.debug('columns %s'%(columns)) + r=recordMaker(*columns) + log.debug('caching : %s'%(r)) + self.cache.cache(columns[ind],r,qType) + records.append(r) + return records + + + + + +def testIPv4(): + log.debug('START TEST IPV4') + c= WhoisClient() + ips=['192.168.0.244','198.51.100.0','202.42.42.42'] + datas=[] + datas=c.lookupmany(ips) + for data in datas: + log.info("c.lookupmany(%s,qType='IP') : %s"%(data.ip, data)) + log.debug('END TEST IPV4\n\n') + +def testIPv6(): + log.debug('START TEST IPv6') + c= WhoisClient() + ips=['2001:4860:8010::68','2001:7a8:1:1::76'] + datas=[] + datas=c.lookupmany(ips,qType='IP6') + i=0 + for data in datas: + log.info("c.lookupmany(%s,qType='IP6') : %s"%(data.ip, data)) + log.info([data]) + i+=1 + log.debug('END TEST IPv6\n\n') + +def testAll(): + testIPv4() + testIPv6() + + +if __name__ == "__main__": + logging.basicConfig(level=logging.INFO) + #testASN() + #testPeer() + lookup_stdin() +