def route(self, target): if not target: return abort(404) ip_address = self._get_ip_address(request) geoip = EntropyGeoIP(self._geoip_path) data = geoip.get_geoip_record_from_ip(ip_address) country = geoip.get_geoip_country_code_from_ip(ip_address) continent = geoip.COUNTRY_CONTINENT.get(country) fallback_continent = "EU" if continent is None: continent = fallback_continent # fallback continent mrs = None try: mrs = Mirrors() mirrors = mrs.continent_mirrors(continent) if not mirrors and continent != fallback_continent: mirrors = mrs.continent_mirrors(fallback_continent) if not mirrors: return abort(404) except ServiceConnectionError: return abort(404) finally: if mrs is not None: mrs.disconnect() # pick one random mirror mirror = random.choice(mirrors) url = os.path.join(mirror, target) return redirect(url)
def _get_geoip_data_from_ip_address(self, ip_address): if os.path.isfile(config.GEOIP_DB_PATH) and \ os.access(config.GEOIP_DB_PATH, os.R_OK): try: geo = EntropyGeoIP(config.GEOIP_DB_PATH) return geo.get_geoip_record_from_ip(ip_address) except: # lame, but I don't know what exceptions are thrown pass