Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also .

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also .
base repository: gsathya/pyonionoo
base: master
head repository: gsathya/pyonionoo
compare: bug6709
Checking mergeability… Don’t worry, you can still create the pull request.
  • 2 commits
  • 7 files changed
  • 0 comments
  • 1 contributor
Showing with 94 additions and 161 deletions.
  1. +1 −0 pyonionoo.conf
  2. +1 −0 pyonionoo/config.py
  3. +44 −0 pyonionoo/database.py
  4. +23 −95 pyonionoo/handlers/bandwidth.py
  5. +18 −59 pyonionoo/handlers/detail.py
  6. +1 −2 pyonionoo/handlers/summary.py
  7. +6 −5 pyonionoo/web.py
@@ -31,3 +31,4 @@ debug = no
[metrics]
out_dir = /tmp
summary_file = summary
details = details
@@ -63,4 +63,5 @@ def parse_config(filename):

settings['metrics_out'] = xget(cfg.get, 'metrics', 'out_dir', '/tmp')
settings['summary_file'] = xget(cfg.get, 'metrics', 'summary_file', 'summary')
settings['details'] = xget(cfg.get, 'metrics', 'details', 'details')
return settings
@@ -286,3 +286,47 @@ def get_summary_routers(running_filter=None, type_filter=None, lookup_filter=Non

total_routers = (relays, bridges, relay_timestamp, bridge_timestamp)
return total_routers

def get_detail_routers(running_filter=None, type_filter=None, lookup_filter=None,
country_filter=None, search_filter=None, order_field=None,
order_asc=True, offset_value=None, limit_value=None):

relay_timestamp, bridge_timestamp = get_timestamp()

relays, bridges = [], []
fields = ('type', 'fingerprint')

for row in query_summary_tbl(running_filter, type_filter, lookup_filter,
country_filter, search_filter,order_field, order_asc,
offset_value, limit_value, fields):
# XXX: make path configurable
path = os.path.join('out/details', row[1])
with open(path) as fh:
data = fh.read().replace('\n', '')

if row[0] == 'r': relays.append(data)
elif row[0] == 'b': bridges.append(data)

return (relays, bridges, relay_timestamp, bridge_timestamp)

def get_bandwidth_routers(running_filter=None, type_filter=None, lookup_filter=None,
country_filter=None, search_filter=None, order_field=None,
order_asc=True, offset_value=None, limit_value=None):

relay_timestamp, bridge_timestamp = get_timestamp()

relays, bridges = [], []
fields = ('type', 'fingerprint')

for row in query_summary_tbl(running_filter, type_filter, lookup_filter,
country_filter, search_filter,order_field, order_asc,
offset_value, limit_value, fields):
# XXX: make path configurable
path = os.path.join('out/bandwidth', row[1])
with open(path) as fh:
data = fh.read().replace('\n', '')

if row[0] == 'r': relays.append(data)
elif row[0] == 'b': bridges.append(data)

return (relays, bridges, relay_timestamp, bridge_timestamp)
@@ -1,110 +1,38 @@
import sys
import pyonionoo.get_router as get_router
import datetime
import pyonionoo.database as get_router

import cyclone.escape
import cyclone.web

from twisted.internet import threads, defer, reactor
from twisted.python import log

import pyonionoo.handlers.arguments as arguments
import pyonionoo.database as database
from pyonionoo.parser import Router

ARGUMENTS = ['type', 'running', 'search', 'lookup', 'country', 'order', 'offset', 'limit']

class BandwidthHandler(cyclone.web.RequestHandler):
def get(self, foo):
"""
return_relays, return_bridges= True, True
hex_fingerprint = None
is_running, return_running = False, False
return_country, return_search = False, False
routers = get_router.get_routers()
for argument in self.request.arguments.iterkeys():
if argument in ARGUMENTS:
#TODO - order, offset, limit
if argument == "running":
return_running = True
value = self.get_argument(argument)
if value == "true":
is_running = True
if value == "false":
is_running = False
if argument == "type":
value = self.get_argument(argument)
if value == "relay":
return_bridges = False
if value == "bridge":
return_relays = False
if argument == "lookup":
hex_fingerprint = self.get_argument(argument)
if argument == "country":
value = self.get_argument(argument)
return_country = True
country_code = value
if argument == "search":
search_input = self.get_argument(argument)
return_search = True
else:
raise ValueError("Invalid Argument!")
"""
@defer.inlineCallbacks
def get(self):
d = threads.deferToThread(self._get_results)
response = yield d
self.write(response)

def _get_results(self):
user_arguments = self.request.arguments
routers = get_router.get_routers(user_arguments)
routers = database.get_bandwidth_routers(**arguments.parse(user_arguments))

response = {}
relays, bridges = [], []
filtered_relays, filtered_bridges, relay_timestamp, bridge_timestamp = routers
relays, bridges, relay_timestamp, bridge_timestamp = routers

# response is a dict, so the order is not maintained. should the
# values in the response be in a specific order?
response['relays'] = relays
response['relays_published'] = relay_timestamp.strftime("%Y-%m-%d %H:%M:%S")
response['bridges'] = bridges
response['bridges_published'] = bridge_timestamp.strftime("%Y-%m-%d %H:%M:%S")

for router in routers:
if router.is_relay and return_relays:
relay_info = {}
relay_info["fingerprint"] = router.fingerprint
write_history_info = {}
3_day_info = {}
1_week_info = {}
1_month_info = {}
3_months_info = {}
1_year_info = {}
5_years_info = {}
3_day_info['first'] =
3_day_info['last'] =
3_day_info['interval'] =
3_day_info['factor'] =
3_day_info['count'] =
3_day_info['values'] =
1_week_info['first'] =
1_week_info['last'] =
1_week_info['interval'] =
1_week_info['factor'] =
1_week_info['count'] =
1_week_info['values'] =
1_month_info['first'] =
1_month_info['last'] =
1_month_info['interval'] =
1_month_info['factor'] =
1_month_info['count'] =
1_month_info['values'] =
3_months_info['first'] =
3_months_info['last'] =
3_months_info['interval'] =
3_months_info['factor'] =
3_months_info['count'] =
3_months_info['values'] =
1_year_info['first'] =
1_year_info['last'] =
1_year_info['interval'] =
1_year_info['factor'] =
1_year_info['count'] =
1_year_info['values'] =
5_years_info['first'] =
5_years_info['last'] =
5_years_info['interval'] =
5_years_info['factor'] =
5_years_info['count'] =
5_years_info['values'] =
write_history_info['3 days'] = 3_day_info
write_history_info['1 week'] = 1_week_info
write_history_info['1 month'] = 1_month_info
write_history_info['3 months'] = 3_months_info
write_history_info['1 year'] = 1_year_info
write_history_info['5 years'] = 5_years_info
relay_info['write_history'] =
return response
@@ -5,75 +5,34 @@
import cyclone.escape
import cyclone.web

from twisted.internet import defer, reactor
from twisted.internet import threads, defer, reactor
from twisted.python import log

import pyonionoo.handlers.arguments as arguments
import pyonionoo.database as database
from pyonionoo.parser import Router

ARGUMENTS = ['type', 'running', 'search', 'lookup', 'country', 'order', 'offset', 'limit']

class DetailHandler(cyclone.web.RequestHandler):
def get(self, foo):
@defer.inlineCallbacks
def get(self):
d = threads.deferToThread(self._get_results)
response = yield d
self.write(response)

def _get_results(self):
user_arguments = self.request.arguments
routers = get_router.get_routers(user_arguments)
routers = database.get_detail_routers(**arguments.parse(user_arguments))

response = {}
relays, bridges = [], []
filtered_relays, filtered_bridges, relay_timestamp, bridge_timestamp = routers
if filtered_relays:
for relay in filtered_relays:
relay_info = {}
relay_info["nickname"] = relay.nickname
relay_info["fingerprint"] = relay.fingerprint
relay_info["or_addresses"] = relay.or_addresses
relay_info["exit_addresses"] = relay.exit_addresses
#relay_info["dir_address"]
relay_info["running"] = relay.is_running
relay_info["flags"] = relay.flags
relay_info["country"] = relay.country_code
#relay_info["country_name"]
#relay_info["region_name"]
#relay_info["city_name"]
#relay_info["latitude"]
#relay_info["longitude"]
#relay_info["as_number"]
#relay_info["as_name"]
relay_info["consensus_weight"] = relay.consensus_weight
relay_info["host_name"] = relay.hostname
#relay_info["last_restarted"]
#relay_info["advertised_bandwidth"]
#relay_info["exit_policy"]
#relay_info["contract"]
#relay_info["platform"]
#relay_info["family"]
#-----------NEW FIELDS------------------------
#relay_info["advertised_bandwidth_fraction]
#relay_info["consensus_weight_fraction"]
#relay_info["guard_probability"]
#relay_info["middle_probability"]
#relay_info["exit_probability"]
relays.append(relay_info)
if filtered_bridges:
for bridge in filtered_bridges:
bridge_info = {}
bridge_info["nickname"] = bridge.nickname
bridge_info["hashed_fingerprint"] = bridge.fingerprint
bridge_info["or_addresses"] = bridge.or_addresses
bridge_info["running"] = bridge.is_running
bridge_info["flags"] = bridge.flags
#bridge_info["last_restarted"]
#bridge_info["advertised_bandwidth"]
#bridge_info["platform"]
#bridge_info["pool_assignment"]
bridges.append(bridge_info)
relays, bridges, relay_timestamp, bridge_timestamp = routers

if relays:
response['relays'] = relays
response['relays_published'] = relay_timestamp.strftime("%Y-%m-%d %H:%M:%S")
if bridges:
response['bridges'] = bridges
response['bridges_published'] = bridge_timestamp.strftime("%Y-%m-%d %H:%M:%S")
# response is a dict, so the order is not maintained. should the
# values in the response be in a specific order?
response['relays'] = relays
response['relays_published'] = relay_timestamp.strftime("%Y-%m-%d %H:%M:%S")
response['bridges'] = bridges
response['bridges_published'] = bridge_timestamp.strftime("%Y-%m-%d %H:%M:%S")


self.write(response)
return response
@@ -26,7 +26,7 @@ def get(self):
d = threads.deferToThread(self._get_results)
response = yield d
self.write(response)

def _get_results(self):
user_arguments = self.request.arguments
routers = database.get_summary_routers(**arguments.parse(user_arguments))
@@ -51,4 +51,3 @@ def _get_results(self):
response['bridges_published'] = bridge_timestamp.strftime("%Y-%m-%d %H:%M:%S")

return response

@@ -18,30 +18,31 @@

import cyclone.locale
import cyclone.web

import handlers.summary as summary
import handlers.detail as detail
import handlers.bandwidth as bandwidth

from pyonionoo import config, database

class Application(cyclone.web.Application):
def __init__(self, config_file):
handlers = [
(r"/summary", summary.SummaryHandler),
(r"/detail", detail.DetailHandler)
(r"/detail", detail.DetailHandler),
(r"/bandwidth", bandwidth.BandwidthHandler),
]

logging.basicConfig(format='%(asctime)s %(message)s', level=logging.INFO)

settings = config.parse_config(config_file)
if not settings['metrics_out']:
raise ValueError

database.bootstrap_database(settings['metrics_out'], settings['summary_file'])

cyclone.web.Application.__init__(self, handlers, **settings)

def stopFactory(self):
print 'stopFactory'
database.cancel_freshen()
cyclone.web.Application.stopFactory(self)

No commit comments for this range