Skip to content

Commit

Permalink
Whois implementation for ip2asn.
Browse files Browse the repository at this point in the history
  • Loading branch information
trolldbois committed Jan 19, 2011
1 parent da9836c commit 3005bd2
Show file tree
Hide file tree
Showing 3 changed files with 128 additions and 61 deletions.
3 changes: 2 additions & 1 deletion cymru/core/cache.py
Expand Up @@ -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) )
Expand Down
62 changes: 2 additions & 60 deletions cymru/core/whois.py
Expand Up @@ -11,40 +11,13 @@
import errno
import logging

import ADNS,adns
import IPy

import cache

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]
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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()



Expand All @@ -206,9 +153,4 @@ def iterwindow(l, slice=50):

if __name__ == "__main__":
logging.basicConfig(level=logging.INFO)
#testOrigin()
#testOrigin6()
#testASN()
#testPeer()
lookup_stdin()

124 changes: 124 additions & 0 deletions 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()

0 comments on commit 3005bd2

Please sign in to comment.