Ejemplo n.º 1
0
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]
Ejemplo n.º 2
0
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