def load_db(db_name, db_fpath): ''' Load a geolocation service. :param db_name: name of the geolocation service. :param db_fpath: location of its data file. ''' # validate database name if db_name not in _dbs.keys(): raise ValueError("Database must be one of: {}".format(_dbs.keys())) # load appropriate database if db_name == "geoip": _dbs[db_name] = GeoIP.open(db_fpath, GeoIP.GEOIP_STANDARD) elif db_name == "ip2location": _dbs[db_name] = IP2Location.IP2Location(db_fpath) elif db_name == "known_networks": _dbs['known_networks'] = _Radix() with open(db_fpath, 'rb') as known_net_file: known_networks = _json.load(known_net_file) for p in known_networks: # Only keep prefices whose country we know if 'country' in p: n = _dbs['known_networks'].add(p['net']) n.data['cc'] = p['country'] elif db_name == "dbip": _dbs[db_name] = _loadDBIP(db_fpath) elif db_name == "ipligence": _dbs[db_name] = IPligence(db_fpath) else: raise ValueError("error loading db {}".format(db_name)) # update table of supported databases global available_dbs available_dbs = [k for k,v in _dbs.items() if v is not None]
def find_anomalies(addresses): ''' Find those IPs for which different geolocation services give different answers about the country of origin. :param addresses: [str] an iterable of ip addresses :return: radix tree of strings. ''' rt = _Radix() for ip_addr in addresses: results = country_code_all(ip_addr, filter_nones=True) if oracle in results: continue # authoritative source # if only <2 dbs could geolocate => potential anomaly if len(results) == 1: rt.add(ip_addr) # not one unique answer for all dbs => potential anomaly elif len(set(results.values())) != 1: rt.add(ip_addr) return rt