diff --git a/.hgtags b/.hgtags --- a/.hgtags +++ b/.hgtags @@ -4,3 +4,4 @@ 1e9bc98a5eec8bf73ebb4019d612828807775cf3 812e073097100155247b2ab698998e604896c37b v5.3.1 89496c406287f75bdcb8ffaca83b3014bee3ee95 v5.4.0 8d9f6524a1fd22d5e0f9e34be24f93b2d59f15a7 v5.4.1 +75aa89d1192a128c7c5042c5d365074e2af67a7e v5.4.2 diff --git a/ennstatus/api/model.py b/ennstatus/api/model.py --- a/ennstatus/api/model.py +++ b/ennstatus/api/model.py @@ -24,10 +24,11 @@ from datetime import datetime import jsonschema import strict_rfc3339 -import requests from flask import current_app from pkg_resources import resource_filename +from onion_py.manager import Manager +from onion_py.caching import OnionSimpleCache from ..utils import check_ip @@ -45,6 +46,8 @@ validate = functools.partial( format_checker=jsonschema.FormatChecker() ) +manager = Manager(OnionSimpleCache()) + def calculate_weight(data): @@ -57,9 +60,9 @@ def calculate_weight(data): except KeyError: continue - factor = subdata['factor'] + factor = subdata.factor - values = [x * factor for x in subdata['values'] if x is not None] + values = [x * factor for x in subdata.values if x is not None] if values: obj[subkey] = statistics.mean(values) * 100 @@ -117,6 +120,7 @@ class Server: self.last_updated = kwargs['last_updated'] self.country = kwargs['country'] self.bandwidth = kwargs.get('bandwidth') + self.flags = kwargs.get('flags') if self.type == 'bridge': self.obfs = kwargs.get('obfs') @@ -224,30 +228,37 @@ class Server: if self.type not in ('exit', 'relay'): raise NotImplementedError - url = 'https://onionoo.torproject.org/weights?lookup={}'.format( - self.fingerprint + try: + data = manager.query('weights', lookup=self.fingerprint) + except: + raise NotImplementedError + + if data is not None: + data = data.relays[0] + + self.mean_consensus_weight = calculate_weight(data.consensus_weight) + self.mean_exit_probability = calculate_weight(data.exit_probability) + self.mean_guard_probability = calculate_weight( + data.guard_probability + ) + self.mean_middle_probability = calculate_weight( + data.middle_probability + ) + self.mean_consensus_weight_fraction = calculate_weight( + data.consensus_weight_fraction ) - data = requests.get(url) + def update_flags(self): try: - data.raise_for_status() - except requests.HTTPError as e: - raise e - else: - data = data.json()['relays'][0] + data = manager.query('details', lookup=self.fingerprint) + except: + raise NotImplementedError - self.mean_consensus_weight = calculate_weight(data['consensus_weight']) - self.mean_exit_probability = calculate_weight(data['exit_probability']) - self.mean_guard_probability = calculate_weight( - data['guard_probability'] - ) - self.mean_middle_probability = calculate_weight( - data['middle_probability'] - ) - self.mean_consensus_weight_fraction = calculate_weight( - data['consensus_weight_fraction'] - ) + if data is not None: + self.flags = data.relays[0].flags + else: + raise NotImplementedError def check_status(self): diff --git a/ennstatus/api/schema/server.json b/ennstatus/api/schema/server.json --- a/ennstatus/api/schema/server.json +++ b/ennstatus/api/schema/server.json @@ -100,6 +100,11 @@ }, "type": { "type": "string" + }, + "flags": { + "type": "array", + "items": { "type": "string" }, + "uniqueItems": true } }, "required": [ diff --git a/ennstatus/api/views.py b/ennstatus/api/views.py --- a/ennstatus/api/views.py +++ b/ennstatus/api/views.py @@ -26,7 +26,6 @@ from werkzeug.exceptions import BadReque import strict_rfc3339 import pygeoip -import requests from ennstatus import csrf from ennstatus.status.functions import (single_server, all_servers, @@ -120,8 +119,10 @@ def update(): server.update_weights() except NotImplementedError: pass - except requests.HTTPError as e: - current_app.logger.error(str(e), exc_info=True) + + try: + server.update_flags() + except NotImplementedError: pass try: diff --git a/requirements.in b/requirements.in --- a/requirements.in +++ b/requirements.in @@ -11,3 +11,4 @@ pygeoip python-gnupg requests strict-rfc3339 +OnionPy diff --git a/requirements.txt b/requirements.txt --- a/requirements.txt +++ b/requirements.txt @@ -18,10 +18,10 @@ itsdangerous==0.24 # via flask Jinja2==2.8 # via flask jsonschema==2.5.1 MarkupSafe==0.23 # via jinja2 +onionpy==0.3.2 pygeoip==0.3.2 python-gnupg==0.3.8 pytz==2015.7 # via babel -requests==2.9.1 strict-rfc3339==0.6 visitor==0.1.2 # via flask-bootstrap Werkzeug==0.11.4 # via flask, flask-wtf diff --git a/setup.py b/setup.py --- a/setup.py +++ b/setup.py @@ -11,7 +11,7 @@ def _get_requirements(): setup(name='Ennstatus', - version='5.4.1-dev', + version='5.4.2-dev', description=('Ennstatus provides the user with vital information about ' 'the status of the organizations Tor servers.'), author='Frënn vun der Ënn',