[tor-commits] [metrics-tasks/master] Add code to check if relay qualifies for tshirt (#9889)

karsten at torproject.org karsten at torproject.org
Mon Mar 31 13:25:43 UTC 2014


commit 3abffe2c86724c3e93b29d670b5673c7f68e5e80
Author: Sreenatha Bhatlapenumarthi <sreenatha.dev at gmail.com>
Date:   Wed Mar 19 19:03:16 2014 +0530

    Add code to check if relay qualifies for tshirt (#9889)
---
 task-9889/tshirt.py |  141 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 141 insertions(+)

diff --git a/task-9889/tshirt.py b/task-9889/tshirt.py
new file mode 100755
index 0000000..b04148b
--- /dev/null
+++ b/task-9889/tshirt.py
@@ -0,0 +1,141 @@
+#!/usr/bin/python
+
+import urllib, urllib2
+import json
+from datetime import datetime
+
+def print_debug_info(exit_port_check, uptime_percent, avg_bandwidth):
+  """ Provides debugging information about relay operator's eligibility 
+      for acquiring a t-shirt """
+
+  print("\nRelay details")
+  print("=============")
+  print("Exit to port 80 allowed : " + str(exit_port_check))
+  print("Uptime percentage in past 2 months : " + str(uptime_percent))
+  print("Average bandwidth in past 2 months : " + str(avg_bandwidth) + "KBytes/s")
+
+  print("\nElligibility")
+  print("============")
+  if avg_bandwidth >= 500:
+    print("Elligible for T-shirt")
+    print("Reason : Average bandwidth greater than 500KBytes/s")
+  else:
+    if exit_port_check is False:
+      print("Not elligible for T-shirt")
+      print("Reason : Average bandwidth less than 500KBytes/s and port 80 blocked")
+    else:
+      if uptime_percent < 95:
+        print("Not elligible for T-shirt")
+        print("Reason : Insufficient relay up time")
+      else:
+        if avg_bandwidth < 100:
+          print("Not elligible for T-shirt")
+          print("Reason : Average bandwidth less than 100KBytes/s")
+        else:
+          print("Elligible for T-shirt")
+	  print("Reason : Average bandwidth greater than 100KBytes/s, relay uptime greater than 95% and port 80 unblocked")
+  print("")
+
+
+def calculate_sum(relay_history):
+  """ Calculates the sum of values in 2-month time frame """
+
+  two_months = 2 * 30 * 86400
+  two_months_values = two_months / relay_history['interval']
+  _sum = 0
+  for i in relay_history['values'][-two_months_values:]:
+    if i is not 'null' and i is not None:
+      _sum += (i/1000.0)
+  return _sum * relay_history['interval']
+
+
+def fetch_data(doc_type, params):
+  """ Fetches onionoo data and returns response formatted as a dictionary """
+
+  # Build the request
+  base_URL = 'https://onionoo.torproject.org/' + doc_type
+  request_URL = base_URL + '?' + urllib.urlencode(params)
+  request = urllib2.Request(url=request_URL)
+  # Send request to Onionoo
+  try:
+    response = urllib2.urlopen(request)
+  except urllib2.HTTPError, error:
+    print("Error " + str(error.code) + ": " + error.reason)
+    exit()
+  # Exit if no relay object in response  
+  response_dict = json.loads(response.read())
+  if response_dict['relays'] == []:
+    print("Error: No such relay")
+    exit()
+  return response_dict
+
+
+def check_exit_port(fingerprint):
+  """ Checks if relay allows network traffic to exit through port 80 """
+
+  params = {
+      'lookup' : fingerprint,
+      'fields' : 'exit_policy_summary'
+  }
+  response = fetch_data('details', params)
+  exit_policy = response['relays'][0]['exit_policy_summary']
+  if 'accept' in exit_policy:
+    return '80' in exit_policy['accept']
+  elif 'reject' in exit_policy:
+    return '80' not in exit_policy['reject']
+  else:
+    return False
+
+
+def get_uptime_percent(fingerprint):
+  """ Calculates the relay's uptime from onionoo's uptime documents """
+
+  params = {
+      'lookup' : fingerprint
+  }
+  response = fetch_data('uptime', params)
+  uptime = calculate_sum(response['relays'][0]['uptime']['3_months'])
+  uptime_percent = round(uptime/(2*30*864), 2)
+  return uptime_percent
+
+
+def get_avg_bandwidth(fingerprint):
+  """ Calculates average bandwidth of traffic through the relay """
+
+  params = {
+      'lookup' : fingerprint
+  }
+  response = fetch_data('bandwidth', params)
+  
+  # Calculate the sum of values in response
+  bandwidth_data = response['relays'][0]['write_history']['3_months']
+  traffic_sum = calculate_sum(bandwidth_data)
+  
+  # Find number of values between last and today
+  last_date = datetime.strptime(bandwidth_data['last'], "%Y-%m-%d %H:%M:%S")
+  today_date = datetime.now()
+  time_interval = int((today_date - last_date).total_seconds())
+  last_today_values = time_interval/bandwidth_data['interval']
+  
+  # Calculate the result
+  two_months = 2 * 30 * 86400
+  two_months_values = two_months/bandwidth_data['interval']
+  total_values = two_months_values + last_today_values
+  result = (traffic_sum * bandwidth_data['factor'])/total_values
+
+  return round(result/1000.0,2)
+
+
+def check_tshirt(fingerprint):
+  """ Checks if the relay satisfies qualification criteria for a t-shirt """
+
+  exit_port_check = check_exit_port(fingerprint)
+  uptime_percent = get_uptime_percent(fingerprint)
+  avg_bandwidth = get_avg_bandwidth(fingerprint)
+  print_debug_info(exit_port_check, uptime_percent, avg_bandwidth)
+
+
+if __name__ == "__main__":
+  fingerprint = raw_input('Enter relay fingerprint: ')
+  check_tshirt(fingerprint)
+





More information about the tor-commits mailing list