[tor-commits] [metrics-tasks/master] Use optparse (#6329).
karsten at torproject.org
karsten at torproject.org
Fri Jul 20 14:00:01 UTC 2012
commit 1178fa61567a24c98c385b75aaf0c9d753959e97
Author: Karsten Loesing <karsten.loesing at gmx.net>
Date: Fri Jul 20 15:32:13 2012 +0200
Use optparse (#6329).
---
task-6329/tor-relays-stats.py | 113 +++++++++++++++++------------------------
1 files changed, 46 insertions(+), 67 deletions(-)
diff --git a/task-6329/tor-relays-stats.py b/task-6329/tor-relays-stats.py
index 4d10488..e62782a 100755
--- a/task-6329/tor-relays-stats.py
+++ b/task-6329/tor-relays-stats.py
@@ -10,6 +10,7 @@ import json
import operator
import sys
import os.path
+from optparse import OptionParser, OptionGroup
class RelayStats(object):
def __init__(self):
@@ -21,17 +22,19 @@ class RelayStats(object):
self._data = json.load(file('details.json'))
return self._data
- def get_relays(self, flags=[], countries='', as_sets=[]):
+ def get_relays(self, countries=[], as_sets=[], exits_only=False, guards_only=False):
relays = []
for relay in self.data['relays']:
if not relay['running']:
continue
- if set(flags) & set(relay['flags']) != set(flags):
- continue
if countries and not relay.get('country', ' ') in countries:
continue
if as_sets and not relay.get('as_number', ' ') in as_sets:
continue
+ if exits_only and not relay.get('exit_probability', -1) > 0.0:
+ continue
+ if guards_only and not relay.get('guard_probability', -1) > 0.0:
+ continue
relays.append(relay)
return relays
@@ -124,70 +127,46 @@ class RelayStats(object):
selection_weights[2] * 100.0, selection_weights[3] * 100.0,
selection_weights[4] * 100.0)
- def output_countries(self, count='10', flags=''):
- count = int(count)
- flags = flags.split()
- relays = self.get_relays(flags)
- grouped_relays = self.group_relays(relays, by_country=True)
- sorted_groups = self.format_and_sort_groups(grouped_relays, by_country=True)
- self.print_groups(sorted_groups, count, by_country=True)
-
- def output_as_sets(self, count='10', flags='', countries=''):
- count = int(count)
- flags = flags.split()
- relays = self.get_relays(flags, countries)
- grouped_relays = self.group_relays(relays, by_as_number=True)
- sorted_groups = self.format_and_sort_groups(grouped_relays, by_as_number=True)
- self.print_groups(sorted_groups, count, by_as_number=True)
-
- def output_relays(self, count='10', flags='', countries='', as_sets=''):
- count = int(count)
- flags = flags.split()
- as_sets = as_sets.split()
- relays = self.get_relays(flags, countries, as_sets)
- grouped_relays = self.group_relays(relays)
- sorted_groups = self.format_and_sort_groups(grouped_relays)
- self.print_groups(sorted_groups, count)
-
-OUTPUTS = {
- 'countries': 'output_countries',
- 'as-sets': 'output_as_sets',
- 'relays': 'output_relays',
-}
-
-def usage():
- print >>sys.stderr, """Usage: %(progname)s <output> [args ...]
-
-Where <output> is one of:
- - countries [COUNT] [FLAGS]
- relative percentage of the consensus in each countries
- - as-sets [COUNT] [FLAGS] [COUNTRIES]
- relative percentage of the consensus in each AS sets
- - relays [COUNT] [FLAGS] [COUNTRIES] [AS_SETS]
- list relays ranked by their place in the whole consensus
-
-Examples:
-
- - To get the top five exit nodes in France:
- %(progname)s top 5 Exit fr
- - To get weights of the top ten AS of all relays in Germany:
- %(progname)s as-sets 10 Running de
-
-This script expect to have a file called 'details.json' in the
-current directory. In order to retrieve the needed data, one
-can issue the following command:
-
- curl -o details.json 'https://onionoo.torproject.org/details?type=relay&running=true'
-""" % { 'progname': sys.argv[0] }
- sys.exit(1)
-
if '__main__' == __name__:
+ parser = OptionParser()
+ group = OptionGroup(parser, "Filtering options")
+ group.add_option("-a", "--as", dest="ases", action="append",
+ help="select only relays from autonomous system number AS",
+ metavar="AS")
+ group.add_option("-c", "--country", action="append",
+ help="select only relays from country with code CC", metavar="CC")
+ group.add_option("-e", "--exits-only", action="store_true",
+ help="select only relays suitable for exit position")
+ group.add_option("-g", "--guards-only", action="store_true",
+ help="select only relays suitable for guard position")
+ parser.add_option_group(group)
+ group = OptionGroup(parser, "Grouping options")
+ group.add_option("-A", "--by-as", action="store_true", default=False,
+ help="group relays by AS")
+ group.add_option("-C", "--by-country", action="store_true", default=False,
+ help="group relays by country")
+ parser.add_option_group(group)
+ group = OptionGroup(parser, "Display options")
+ group.add_option("-t", "--top", type="int", default=10, metavar="NUM",
+ help="display only the top results (default: %default)")
+ parser.add_option_group(group)
+ (options, args) = parser.parse_args()
+ if len(args) > 0:
+ parser.error("Did not understand positional argument(s), use options instead.")
if not os.path.exists('details.json'):
- usage()
- if len(sys.argv) == 1:
- usage()
- func = OUTPUTS.get(sys.argv[1], None)
- if not func:
- usage()
+ parser.error("Did not find details.json. Please download this file using the following command:\ncurl -o details.json 'https://onionoo.torproject.org/details?type=relay&running=true'")
+
stats = RelayStats()
- getattr(stats, func)(*sys.argv[2:])
+ relays = stats.get_relays(countries=options.country,
+ as_sets=options.ases,
+ exits_only=options.exits_only,
+ guards_only=options.guards_only)
+ grouped_relays = stats.group_relays(relays,
+ by_country=options.by_country,
+ by_as_number=options.by_as)
+ sorted_groups = stats.format_and_sort_groups(grouped_relays,
+ by_country=options.by_country,
+ by_as_number=options.by_as)
+ stats.print_groups(sorted_groups, options.top,
+ by_country=options.by_country,
+ by_as_number=options.by_as)
More information about the tor-commits
mailing list