tor-commits
Threads by month
- ----- 2025 -----
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
November 2012
- 18 participants
- 1508 discussions

07 Nov '12
commit 654147c3a92156c35fc1a8ecc0aac8e933f57e59
Author: Arturo Filastò <arturo(a)filasto.net>
Date: Wed Nov 7 00:47:59 2012 +0100
Remove all references to the old API
---
docs/source/index.rst | 40 ++-
nettests/bridge_reachability/echo.py | 5 +-
nettests/core/echo.py | 1 -
ooni/__init__.py | 7 -
ooni/custodiet.py | 421 -------------------------------
ooni/lib/Makefile | 36 ---
ooni/nodes.py | 176 +++++++++++++
ooni/oonicli.py | 11 +-
ooni/plugoo/__init__.py | 47 ----
ooni/plugoo/assets.py | 62 -----
ooni/plugoo/interface.py | 56 ----
ooni/plugoo/nodes.py | 176 -------------
ooni/plugoo/reports.py | 145 -----------
ooni/plugoo/tests.py | 142 -----------
ooni/plugoo/work.py | 148 -----------
ooni/protocols/http.py | 141 -----------
ooni/protocols/scapyproto.py | 55 ----
ooni/reporter.py | 20 +-
ooni/runner.py | 61 +----
ooni/scaffolding.py | 78 ------
ooni/utils/legacy.py | 459 ----------------------------------
21 files changed, 228 insertions(+), 2059 deletions(-)
diff --git a/docs/source/index.rst b/docs/source/index.rst
index 5c96dd1..2497a09 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -15,26 +15,41 @@ about the various types, methods, and amounts of network tampering in the world.
Getting started
***************
-If you choose to use virtualenv to setup your development environment you will
-need to do the following::
+Requirements:
- virtualenv ENV
- source ENV/bin/activate
- pip install twisted Scapy pyyaml pyOpenSSL
+ * Git: http://git-scm.com/book/en/Getting-Started-Installing-Git
+ * Python >= 2.6: http://www.python.org/download/releases/
+ * pip: http://www.pip-installer.org/en/latest/
-To get the latest version of scapy you will need mercurial. You can then install
-it with::
+On debian based systems these can be installed with:
- pip install hg+http://hg.secdev.org/scapy
+ apt-get install git-core python python-pip python-dev
-On debian you can install all the dependecies with apt-get with this command::
+The python dependencies required for running ooniprobe are:
- apt-get install python-twisted python-twisted-names python-yaml python-scapy python-beautifulsoup
+ * Twisted
+ * Scapy
+ * txtorcon
-Once you have installed all the dependencies OONI tests can be run like so::
+They can be installed from the requirements.txt with:
- bin/ooniprobe path/to/test.py --cmd1 foo --cmd2 bar
+ pip install -r requirements.txt
+You are highly recommended to do so from inside of a virtual environment, since
+pip does not download the packages via SSL and you will need to install it
+system wide.
+
+This will require you to have installed virtualenv.
+
+ apt-get install python-virtualenv
+
+To create a new virtual environment do
+
+ virtualenv env
+
+Then install OONI with:
+
+ pip install -r requirements.txt
Contents
********
@@ -45,7 +60,6 @@ Contents
oonib
install
- tutorial
writing_tests
api/*
glossary
diff --git a/nettests/bridge_reachability/echo.py b/nettests/bridge_reachability/echo.py
index 611970e..0c20a3f 100644
--- a/nettests/bridge_reachability/echo.py
+++ b/nettests/bridge_reachability/echo.py
@@ -50,8 +50,7 @@ class EchoTest(ScapyTest):
description = 'A simple ICMP-8 test to see if a host is reachable.'
version = '0.0.1'
inputFile = ['file', 'f', None, 'File of list of IPs to ping']
- requirements = None
- #report = Storage()
+ requiresRoot = True
optParameters = [
['interface', 'i', None, 'Network interface to use'],
@@ -73,7 +72,7 @@ class EchoTest(ScapyTest):
if self.localOptions:
log.debug("%s: local_options found" % self.name)
for key, value in self.localOptions.items():
- log.debug("%s: setting self.%s = %s" % (key, value))
+ log.debug("setting self.%s = %s" % (key, value))
setattr(self, key, value)
## xxx is this now .subOptions?
diff --git a/nettests/core/echo.py b/nettests/core/echo.py
deleted file mode 120000
index d9926cd..0000000
--- a/nettests/core/echo.py
+++ /dev/null
@@ -1 +0,0 @@
-../../ooni/bridget/tests/echo.py
\ No newline at end of file
diff --git a/ooni/__init__.py b/ooni/__init__.py
index 659d4af..0c9f297 100644
--- a/ooni/__init__.py
+++ b/ooni/__init__.py
@@ -9,13 +9,6 @@ from . import runner
from . import templates
from . import utils
-# XXX below are legacy related modules
-#from . import ooniprobe
-#from . import plugoo
-#from . import plugins
-
__all__ = ['oconfig', 'inputunit', 'kit',
'lib', 'nettest', 'oonicli', 'reporter',
'runner', 'templates', 'utils']
- # XXX below are legacy related modules
- #'ooniprobe', 'plugoo', 'plugins']
diff --git a/ooni/custodiet.py b/ooni/custodiet.py
deleted file mode 100755
index 8cbcfce..0000000
--- a/ooni/custodiet.py
+++ /dev/null
@@ -1,421 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: UTF-8
-#
-# custodiet
-# *********
-#
-# "...quis custodiet ipsos custodes?"
-# - Juvenal, Satires VI.347-348 (circa 2nd Century, C.E.)
-#
-# "'Hand me the Custodian,' Goodchild demands, inserting the waiflike
-# robot into Bambara's opened navel. 'Providing conscience for those who
-# have none.' Goodchild and the other Breen government agents disappear
-# into the surrounding desert in a vehicle, kicking up cloud of white dust.
-# Bambara awakens, and, patting the dust from his clothing, turns to
-# greet a one-armed child. 'Hi, my name's Bambara; I'm a
-# thirty-six-year-old Virgo and a former killer, who's hobbies include
-# performing recreational autopsies, defecating, and drinking rum. I've
-# recently been given a conscience, and would very much like to help you.'
-# Cut to Bambara and the child, now with one of Bambara's arms, leaving
-# a surgical clinic."
-# - AeonFlux, "The Purge" (sometime in the late 90s)
-#
-# :copyright: (c) 2012 Isis Lovecruft
-# :license: see LICENSE for more details.
-# :version: 0.1.0-beta
-#
-
-# ooniprobe.py imports
-import sys
-from signal import SIGTERM, signal
-from pprint import pprint
-
-from twisted.python import usage
-from twisted.internet import reactor
-from twisted.plugin import getPlugins
-
-from zope.interface.verify import verifyObject
-from zope.interface.exceptions import BrokenImplementation
-from zope.interface.exceptions import BrokenMethodImplementation
-
-from ooni.bridget.tests import bridget
-from ooni.bridget.utils import log, tests, work, reports
-from ooni.bridget.utils.interface import ITest
-from ooni.utils.logo import getlogo
-
-# runner.py imports
-import os
-import types
-import time
-import inspect
-import yaml
-
-from twisted.internet import defer, reactor
-from twisted.python import reflect, failure, usage
-from twisted.python import log as tlog
-
-from twisted.trial import unittest
-from twisted.trial.runner import TrialRunner, TestLoader
-from twisted.trial.runner import isPackage, isTestCase, ErrorHolder
-from twisted.trial.runner import filenameToModule, _importFromFile
-
-from ooni import nettest
-from ooni.inputunit import InputUnitFactory
-from ooni.nettest import InputTestSuite
-from ooni.plugoo import tests as oonitests
-from ooni.reporter import ReporterFactory
-from ooni.utils import log, geodata, date
-from ooni.utils.legacy import LegacyOONITest
-from ooni.utils.legacy import start_legacy_test, adapt_legacy_test
-
-
-__version__ = "0.1.0-beta"
-
-
-#def retrieve_plugoo():
-# """
-# Get all the plugins that implement the ITest interface and get the data
-# associated to them into a dict.
-# """
-# interface = ITest
-# d = {}
-# error = False
-# for p in getPlugins(interface, plugins):
-# try:
-# verifyObject(interface, p)
-# d[p.shortName] = p
-# except BrokenImplementation, bi:
-# print "Plugin Broken"
-# print bi
-# error = True
-# if error != False:
-# print "Plugin Loaded!"
-# return d
-#
-#plugoo = retrieve_plugoo()
-
-"""
-
-ai to watch over which tests to run - custodiet
-
- * runTest() or getPrefixMethodNames() to run the tests in order for each
- test (esp. the tcp and icmp parts) to be oonicompat we should use the
- test_icmp_ping API framework for those.
-
- * should handle calling
-
-tests to run:
- echo
- syn
- fin
- conn
- tls
- tor
-need fakebridge - canary
-
-"""
-
-def runTest(test, options, global_options, reactor=reactor):
- """
- Run an OONI probe test by name.
-
- @param test: a string specifying the test name as specified inside of
- shortName.
-
- @param options: the local options to be passed to the test.
-
- @param global_options: the global options for OONI
- """
- parallelism = int(global_options['parallelism'])
- worker = work.Worker(parallelism, reactor=reactor)
- test_class = plugoo[test].__class__
- report = reports.Report(test, global_options['output'])
-
- log_to_stdout = True
- if global_options['quiet']:
- log_to_stdout = False
-
- log.start(log_to_stdout,
- global_options['log'],
- global_options['verbosity'])
-
- resume = 0
- if not options:
- options = {}
- if 'resume' in options:
- resume = options['resume']
-
- test = test_class(options, global_options, report, reactor=reactor)
- if test.tool:
- test.runTool()
- return True
-
- if test.ended:
- print "Ending test"
- return None
-
- wgen = work.WorkGenerator(test,
- dict(options),
- start=resume)
- for x in wgen:
- worker.push(x)
-
-class MainOptions(usage.Options):
- tests = [bridget, ]
- subCommands = []
- for test in tests:
- print test
- testopt = getattr(test, 'options')
- subCommands.append([test, None, testopt, "Run the %s test" % test])
-
- optFlags = [
- ['quiet', 'q', "Don't log to stdout"]
- ]
-
- optParameters = [
- ['parallelism', 'n', 10, "Specify the number of parallel tests to run"],
- #['target-node', 't', 'localhost:31415', 'Select target node'],
- ['output', 'o', 'bridge.log', "Specify output report file"],
- ['reportfile', 'o', 'bridge.log', "Specify output log file"],
- ['verbosity', 'v', 1, "Specify the logging level"],
- ]
-
- def opt_version(self):
- """
- Display OONI version and exit.
- """
- print "OONI version:", __version__
- sys.exit(0)
-
- def __str__(self):
- """
- Hack to get the sweet ascii art into the help output and replace the
- strings "Commands" with "Tests".
- """
- return getlogo() + '\n' + self.getSynopsis() + '\n' + \
- self.getUsage(width=None).replace("Commands:", "Tests:")
-
-
-
-def isTestCase(thing):
- try:
- return issubclass(thing, unittest.TestCase)
- except TypeError:
- return False
-
-def isLegacyTest(obj):
- """
- Returns True if the test in question is written using the OONITest legacy
- class.
- We do this for backward compatibility of the OONIProbe API.
- """
- try:
- if issubclass(obj, oonitests.OONITest) and not obj == oonitests.OONITest:
- return True
- else:
- return False
- except TypeError:
- return False
-
-def processTest(obj, config):
- """
- Process the parameters and :class:`twisted.python.usage.Options` of a
- :class:`ooni.nettest.Nettest`.
-
- :param obj:
- An uninstantiated old test, which should be a subclass of
- :class:`ooni.plugoo.tests.OONITest`.
- :param config:
- A configured and instantiated :class:`twisted.python.usage.Options`
- class.
- """
-
- inputFile = obj.inputFile
-
- if obj.optParameters or inputFile:
- if not obj.optParameters:
- obj.optParameters = []
-
- if inputFile:
- obj.optParameters.append(inputFile)
-
- class Options(usage.Options):
- optParameters = obj.optParameters
-
- options = Options()
- options.parseOptions(config['subArgs'])
- obj.localOptions = options
-
- if inputFile:
- obj.inputFile = options[inputFile[0]]
- try:
- tmp_obj = obj()
- tmp_obj.getOptions()
- except usage.UsageError:
- options.opt_help()
-
- return obj
-
-def findTestClassesFromConfig(config):
- """
- Takes as input the command line config parameters and returns the test
- case classes.
- If it detects that a certain test class is using the old OONIProbe format,
- then it will adapt it to the new testing system.
-
- :param config:
- A configured and instantiated :class:`twisted.python.usage.Options`
- class.
- :return:
- A list of class objects found in a file or module given on the
- commandline.
- """
-
- filename = config['test']
- classes = []
-
- module = filenameToModule(filename)
- for name, val in inspect.getmembers(module):
- if isTestCase(val):
- classes.append(processTest(val, config))
- elif isLegacyTest(val):
- classes.append(adapt_legacy_test(val, config))
- return classes
-
-def makeTestCases(klass, tests, methodPrefix):
- """
- Takes a class some tests and returns the test cases. methodPrefix is how
- the test case functions should be prefixed with.
- """
-
- cases = []
- for test in tests:
- cases.append(klass(methodPrefix+test))
- return cases
-
-def loadTestsAndOptions(classes, config):
- """
- Takes a list of classes and returns their testcases and options.
- Legacy tests will be adapted.
- """
-
- methodPrefix = 'test'
- suiteFactory = InputTestSuite
- options = []
- testCases = []
- names = []
-
- _old_klass_type = LegacyOONITest
-
- for klass in classes:
- if isinstance(klass, _old_klass_type):
- try:
- cases = start_legacy_test(klass)
- #cases.callback()
- if cases:
- print cases
- return [], []
- testCases.append(cases)
- except Exception, e:
- log.err(e)
- else:
- try:
- opts = klass.local_options
- options.append(opts)
- except AttributeError, ae:
- options.append([])
- log.err(ae)
- elif not isinstance(klass, _old_klass_type):
- tests = reflect.prefixedMethodNames(klass, methodPrefix)
- if tests:
- cases = makeTestCases(klass, tests, methodPrefix)
- testCases.append(cases)
- try:
- k = klass()
- opts = k.getOptions()
- options.append(opts)
- except AttributeError, ae:
- options.append([])
- log.err(ae)
- else:
- try:
- raise RuntimeError, "Class is some strange type!"
- except RuntimeError, re:
- log.err(re)
-
- return testCases, options
-
-class ORunner(object):
- """
- This is a specialized runner used by the ooniprobe command line tool.
- I am responsible for reading the inputs from the test files and splitting
- them in input units. I also create all the report instances required to run
- the tests.
- """
- def __init__(self, cases, options=None, config=None, *arg, **kw):
- self.baseSuite = InputTestSuite
- self.cases = cases
- self.options = options
-
- try:
- assert len(options) != 0, "Length of options is zero!"
- except AssertionError, ae:
- self.inputs = []
- log.err(ae)
- else:
- try:
- first = options.pop(0)
- except:
- first = {}
- if 'inputs' in first:
- self.inputs = options['inputs']
- else:
- log.msg("Could not find inputs!")
- log.msg("options[0] = %s" % first)
- self.inputs = [None]
-
- try:
- reportFile = open(config['reportfile'], 'a+')
- except:
- filename = 'report_'+date.timestamp()+'.yaml'
- reportFile = open(filename, 'a+')
- self.reporterFactory = ReporterFactory(reportFile,
- testSuite=self.baseSuite(self.cases))
-
- def runWithInputUnit(self, inputUnit):
- idx = 0
- result = self.reporterFactory.create()
-
- for inputs in inputUnit:
- result.reporterFactory = self.reporterFactory
-
- suite = self.baseSuite(self.cases)
- suite.input = inputs
- suite(result, idx)
-
- # XXX refactor all of this index bullshit to avoid having to pass
- # this index around. Probably what I want to do is go and make
- # changes to report to support the concept of having multiple runs
- # of the same test.
- # We currently need to do this addition in order to get the number
- # of times the test cases that have run inside of the test suite.
- idx += (suite._idx - idx)
-
- result.done()
-
- def run(self):
- self.reporterFactory.options = self.options
- for inputUnit in InputUnitFactory(self.inputs):
- self.runWithInputUnit(inputUnit)
-
-if __name__ == "__main__":
- config = Options()
- config.parseOptions()
-
- if not config.subCommand:
- config.opt_help()
- signal(SIGTERM)
- #sys.exit(1)
-
- runTest(config.subCommand, config.subOptions, config)
- reactor.run()
diff --git a/ooni/lib/Makefile b/ooni/lib/Makefile
deleted file mode 100644
index c40b8d2..0000000
--- a/ooni/lib/Makefile
+++ /dev/null
@@ -1,36 +0,0 @@
-all: txtorcon
-
-txtraceroute:
- echo "Processing dependency txtraceroute..."
- git clone https://github.com/hellais/txtraceroute.git txtraceroute.git
- mv txtraceroute.git/txtraceroute.py txtraceroute.py
- rm -rf txtraceroute.git
-
-txtorcon:
- echo "Processing dependency txtorcon..."
- git clone https://github.com/meejah/txtorcon.git txtorcon.git
- mv txtorcon.git/txtorcon txtorcon
- rm -rf txtorcon.git
-
-clean:
- rm -rf txtorcon
-# rm -rf txtraceroute.py
-# rm -rf txscapy.py
-
-cleanall:
- rm -rf txtorcon
- rm -rf txtraceroute.py
- rm -rf txscapy.py
-
-txscapy:
- echo "Processing dependency txscapy"
- git clone https://github.com/hellais/txscapy.git txscapy.git
- mv txscapy.git/txscapy.py txscapy.py
- rm -rf txscapy.git
-
-#rfc3339:
-# echo "Processing RFC3339 dependency"
-# hg clone https://bitbucket.org/henry/rfc3339 rfc3339
-# mv rfc3339/rfc3339.py rfc3339.py
-# rm -rf rfc3339
-
diff --git a/ooni/nodes.py b/ooni/nodes.py
new file mode 100644
index 0000000..155f183
--- /dev/null
+++ b/ooni/nodes.py
@@ -0,0 +1,176 @@
+#!/usr/bin/env python
+# -*- coding: UTF-8
+"""
+ nodes
+ *****
+
+ This contains all the code related to Nodes
+ both network and code execution.
+
+ :copyright: (c) 2012 by Arturo Filastò, Isis Lovecruft
+ :license: see LICENSE for more details.
+
+"""
+
+import os
+from binascii import hexlify
+
+try:
+ import paramiko
+except:
+ print "Error: module paramiko is not installed."
+from pprint import pprint
+import sys
+import socks
+import xmlrpclib
+
+class Node(object):
+ def __init__(self, address, port):
+ self.address = address
+ self.port = port
+
+class LocalNode(object):
+ def __init__(self):
+ pass
+
+"""
+[]: node = NetworkNode("192.168.0.112", 5555, "SOCKS5")
+[]: node_socket = node.wrap_socket()
+"""
+class NetworkNode(Node):
+ def __init__(self, address, port, node_type="SOCKS5", auth_creds=None):
+ self.node = Node(address,port)
+
+ # XXX support for multiple types
+ # node type (SOCKS proxy, HTTP proxy, GRE tunnel, ...)
+ self.node_type = node_type
+ # type-specific authentication credentials
+ self.auth_creds = auth_creds
+
+ def _get_socksipy_socket(self, proxy_type, auth_creds):
+ import socks
+ s = socks.socksocket()
+ # auth_creds[0] -> username
+ # auth_creds[1] -> password
+ s.setproxy(proxy_type, self.node.address, self.node.port,
+ self.auth_creds[0], self.auth_creds[1])
+ return s
+
+ def _get_socket_wrapper(self):
+ if (self.node_type.startswith("SOCKS")): # SOCKS proxies
+ if (self.node_type != "SOCKS5"):
+ proxy_type = socks.PROXY_TYPE_SOCKS5
+ elif (self.node_type != "SOCKS4"):
+ proxy_type = socks.PROXY_TYPE_SOCKS4
+ else:
+ print "We don't know this proxy type."
+ sys.exit(1)
+
+ return self._get_socksipy_socket(proxy_type)
+ elif (self.node_type == "HTTP"): # HTTP proxies
+ return self._get_socksipy_socket(PROXY_TYPE_HTTP)
+ else: # Unknown proxies
+ print "We don't know this proxy type."
+ sys.exit(1)
+
+ def wrap_socket(self):
+ return self._get_socket_wrapper()
+
+class CodeExecNode(Node):
+ def __init__(self, address, port, node_type, auth_creds):
+ self.node = Node(address,port)
+
+ # node type (SSH proxy, etc.)
+ self.node_type = node_type
+ # type-specific authentication credentials
+ self.auth_creds = auth_creds
+
+ def add_unit(self):
+ pass
+
+ def get_status(self):
+ pass
+
+class PlanetLab(CodeExecNode):
+ def __init__(self, address, auth_creds, ooni):
+ self.auth_creds = auth_creds
+
+ self.config = ooni.utils.config
+ self.logger = ooni.logger
+ self.name = "PlanetLab"
+
+ def _api_auth(self):
+ api_server = xmlrpclib.ServerProxy('https://www.planet-lab.org/PLCAPI/')
+ auth = {}
+ ## should be changed to separate node.conf file
+ auth['Username'] = self.config.main.pl_username
+ auth['AuthString'] = self.config.main.pl_password
+ auth['AuthMethod'] = "password"
+ authorized = api_server.AuthCheck(auth)
+
+ if authorized:
+ print 'We are authorized!'
+ return auth
+ else:
+ print 'Authorization failed. Please check your settings for pl_username and pl_password in the ooni-probe.conf file.'
+
+ def _search_for_nodes(self, node_filter=None):
+ api_server = xmlrpclib.ServerProxy('https://www.planet-lab.org/PLCAPI/', allow_none=True)
+ node_filter = {'hostname': '*.cert.org.cn'}
+ return_fields = ['hostname', 'site_id']
+ all_nodes = api_server.GetNodes(self.api_auth(), node_filter, boot_state_filter)
+ pprint(all_nodes)
+ return all_nodes
+
+ def _add_nodes_to_slice(self):
+ api_server = xmlrpclib.ServerProxy('https://www.planet-lab.org/PLCAPI/', allow_none=True)
+ all_nodes = self.search_for_nodes()
+ for node in all_nodes:
+ api_server.AddNode(self.api_auth(), node['site_id'], all_nodes)
+ print 'Adding nodes %s' % node['hostname']
+
+ def _auth_login(slicename, machinename):
+ """Attempt to authenticate to the given PL node, slicename and
+ machinename, using any of the private keys in ~/.ssh/ """
+
+ agent = paramiko.Agent()
+ agent_keys = agent.get_keys()
+ if len(agent_keys) == 0:
+ return
+
+ for key in agent_keys:
+ print 'Trying ssh-agent key %s' % hexlify(key.get_fingerprint()),
+ try:
+ paramiko.transport.auth_publickey(machinename, slicename)
+ print 'Public key authentication to PlanetLab node %s successful.' % machinename,
+ return
+ except paramiko.SSHException:
+ print 'Public key authentication to PlanetLab node %s failed.' % machinename,
+
+ def _get_command():
+ pass
+
+ def ssh_and_run_(slicename, machinename, command):
+ """Attempt to make a standard OpenSSH client to PL node, and run
+ commands from a .conf file."""
+
+ ## needs a way to specify 'ssh -l <slicename> <machinename>'
+ ## with public key authentication.
+
+ command = PlanetLab.get_command()
+
+ client = paramiko.SSHClient()
+ client.load_system_host_keys()
+ client.connect(machinename)
+
+ stdin, stdout, stderr = client.exec_command(command)
+
+ def send_files_to_node(directory, files):
+ """Attempt to rsync a tree to the PL node."""
+ pass
+
+ def add_unit():
+ pass
+
+ def get_status():
+ pass
diff --git a/ooni/oonicli.py b/ooni/oonicli.py
index 1988652..6def1df 100644
--- a/ooni/oonicli.py
+++ b/ooni/oonicli.py
@@ -32,12 +32,12 @@ from ooni.utils import log
class Options(usage.Options, app.ReactorSelectionMixin):
- synopsis = """%s [options] [[file|package|module|TestCase|testmethod]...]
+ synopsis = """%s [options] [path to test].py
""" % (os.path.basename(sys.argv[0]),)
longdesc = ("ooniprobe loads and executes a suite or a set of suites of"
- "network tests. These are loaded from modules, packages and"
- "files listed on the command line")
+ " network tests. These are loaded from modules, packages and"
+ " files listed on the command line")
optFlags = [["help", "h"],
['debug-stacktraces', 'B',
@@ -47,8 +47,6 @@ class Options(usage.Options, app.ReactorSelectionMixin):
optParameters = [
["reportfile", "o", None, "report file name"],
["logfile", "l", None, "log file name"],
- ['temp-directory', None, '_ooni_temp',
- 'Path to use as working directory for tests.']
]
compData = usage.Completions(
@@ -98,12 +96,11 @@ def run():
if config['debug-stacktraces']:
defer.setDebugging(True)
- log.start(config['logfile'])
-
classes = runner.findTestClassesFromConfig(config)
casesList, options = runner.loadTestsAndOptions(classes, config)
for idx, cases in enumerate(casesList):
orunner = runner.ORunner(cases, options[idx], config)
+ log.start(config['logfile'])
orunner.run()
diff --git a/ooni/plugoo/__init__.py b/ooni/plugoo/__init__.py
deleted file mode 100644
index f3a49e9..0000000
--- a/ooni/plugoo/__init__.py
+++ /dev/null
@@ -1,47 +0,0 @@
-# -*- coding: UTF-8
-"""
- plugoo
- ******
-
- This contains all of the "goo" necessary for creating
- ooni-probe plugoonies.
-
- :copyright: (c) 2012 by Arturo Filastò.
- :license: see LICENSE for more details.
-
-"""
-
-__all__ = ['assets', 'nodes', 'reports', 'tests']
-
-import os
-from datetime import datetime
-import yaml
-
-import logging
-import itertools
-
-def gen_headers(self, options="common"):
- """
- Returns a set of headers to be used when generating
- HTTP requests.
-
- :options specify what rules should be used for
- generating the headers.
- "common": choose a very common header set (default)
- "random": make the headers random
- """
- if options == "common":
- headers = [('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'),
- ('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.3'),
- ('Accept-Encoding', 'gzip,deflate,sdch'),
- ('Accept-Language', 'en,en-US;q=0.8,it;q=0.6'),
- ('Cache-Control', 'max-age=0')
- ('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11')]
- elif options == "random":
- # XXX not implemented
- return False
- else:
- print "Error, unrecognized header generation options.."
- return False
-
- return headers
diff --git a/ooni/plugoo/assets.py b/ooni/plugoo/assets.py
deleted file mode 100644
index 205d60d..0000000
--- a/ooni/plugoo/assets.py
+++ /dev/null
@@ -1,62 +0,0 @@
-class Asset:
- """
- This is an ooni-probe asset. It is a python
- iterator object, allowing it to be efficiently looped.
- To create your own custom asset your should subclass this
- and override the next_asset method and the len method for
- computing the length of the asset.
- """
- def __init__(self, file=None, *args, **argv):
- self.fh = None
- if file:
- self.name = file
- self.fh = open(file, 'r')
- self.eof = False
-
- def __iter__(self):
- return self
-
- def len(self):
- """
- Returns the length of the asset
- """
- for i, l in enumerate(self.fh):
- pass
- # rewind the file
- self.fh.seek(0)
- return i + 1
-
- def parse_line(self, line):
- """
- Override this method if you need line
- by line parsing of an Asset.
- """
- return line.replace('\n','')
-
- def next_asset(self):
- """
- Return the next asset.
- """
- # XXX this is really written with my feet.
- # clean me up please...
- line = self.fh.readline()
- if line:
- parsed_line = self.parse_line(line)
- if parsed_line:
- return parsed_line
- else:
- self.fh.seek(0)
- raise StopIteration
-
- def next(self):
- try:
- return self.next_asset()
- except:
- raise StopIteration
-
-class MissingAssetException(Exception):
- """Raised when an Asset necessary for running the Test is missing."""
- def __init__(self, error_message):
- print error_message
- import sys
- return sys.exit()
diff --git a/ooni/plugoo/interface.py b/ooni/plugoo/interface.py
deleted file mode 100644
index 6dc83a0..0000000
--- a/ooni/plugoo/interface.py
+++ /dev/null
@@ -1,56 +0,0 @@
-from zope.interface import implements, Interface, Attribute
-
-class ITest(Interface):
- """
- This interface represents an OONI test. It fires a deferred on completion.
- """
-
- shortName = Attribute("""A short user facing description for this test""")
- description = Attribute("""A string containing a longer description for the test""")
-
- requirements = Attribute("""What is required to run this this test, for example raw socket access or UDP or TCP""")
-
- options = Attribute("""These are the arguments to be passed to the test for it's execution""")
-
- blocking = Attribute("""True or False, stating if the test should be run in a thread or not.""")
-
- def control(experiment_result, args):
- """
- @param experiment_result: The result returned by the experiment method.
-
- @param args: the keys of this dict are the names of the assets passed in
- from load_assets. The value is one item of the asset.
-
- Must return a dict containing what should be written to the report.
- Anything returned by control ends up inside of the YAMLOONI report.
- """
-
- def experiment(args):
- """
- Perform all the operations that are necessary to running a test.
-
- @param args: the keys of this dict are the names of the assets passed in
- from load_assets. The value is one item of the asset.
-
- Must return a dict containing the values to be passed to control.
- """
-
- def load_assets():
- """
- Load the assets that should be passed to the Test. These are the inputs
- to the OONI test.
- Must return a dict that has as keys the asset names and values the
- asset contents.
- If the test does not have any assets it should return an empty dict.
- """
-
- def end():
- """
- This can be called at any time to terminate the execution of all of
- these test instances.
-
- What this means is that no more test instances with new parameters will
- be created. A report will be written.
- """
-
-
diff --git a/ooni/plugoo/nodes.py b/ooni/plugoo/nodes.py
deleted file mode 100644
index 155f183..0000000
--- a/ooni/plugoo/nodes.py
+++ /dev/null
@@ -1,176 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: UTF-8
-"""
- nodes
- *****
-
- This contains all the code related to Nodes
- both network and code execution.
-
- :copyright: (c) 2012 by Arturo Filastò, Isis Lovecruft
- :license: see LICENSE for more details.
-
-"""
-
-import os
-from binascii import hexlify
-
-try:
- import paramiko
-except:
- print "Error: module paramiko is not installed."
-from pprint import pprint
-import sys
-import socks
-import xmlrpclib
-
-class Node(object):
- def __init__(self, address, port):
- self.address = address
- self.port = port
-
-class LocalNode(object):
- def __init__(self):
- pass
-
-"""
-[]: node = NetworkNode("192.168.0.112", 5555, "SOCKS5")
-[]: node_socket = node.wrap_socket()
-"""
-class NetworkNode(Node):
- def __init__(self, address, port, node_type="SOCKS5", auth_creds=None):
- self.node = Node(address,port)
-
- # XXX support for multiple types
- # node type (SOCKS proxy, HTTP proxy, GRE tunnel, ...)
- self.node_type = node_type
- # type-specific authentication credentials
- self.auth_creds = auth_creds
-
- def _get_socksipy_socket(self, proxy_type, auth_creds):
- import socks
- s = socks.socksocket()
- # auth_creds[0] -> username
- # auth_creds[1] -> password
- s.setproxy(proxy_type, self.node.address, self.node.port,
- self.auth_creds[0], self.auth_creds[1])
- return s
-
- def _get_socket_wrapper(self):
- if (self.node_type.startswith("SOCKS")): # SOCKS proxies
- if (self.node_type != "SOCKS5"):
- proxy_type = socks.PROXY_TYPE_SOCKS5
- elif (self.node_type != "SOCKS4"):
- proxy_type = socks.PROXY_TYPE_SOCKS4
- else:
- print "We don't know this proxy type."
- sys.exit(1)
-
- return self._get_socksipy_socket(proxy_type)
- elif (self.node_type == "HTTP"): # HTTP proxies
- return self._get_socksipy_socket(PROXY_TYPE_HTTP)
- else: # Unknown proxies
- print "We don't know this proxy type."
- sys.exit(1)
-
- def wrap_socket(self):
- return self._get_socket_wrapper()
-
-class CodeExecNode(Node):
- def __init__(self, address, port, node_type, auth_creds):
- self.node = Node(address,port)
-
- # node type (SSH proxy, etc.)
- self.node_type = node_type
- # type-specific authentication credentials
- self.auth_creds = auth_creds
-
- def add_unit(self):
- pass
-
- def get_status(self):
- pass
-
-class PlanetLab(CodeExecNode):
- def __init__(self, address, auth_creds, ooni):
- self.auth_creds = auth_creds
-
- self.config = ooni.utils.config
- self.logger = ooni.logger
- self.name = "PlanetLab"
-
- def _api_auth(self):
- api_server = xmlrpclib.ServerProxy('https://www.planet-lab.org/PLCAPI/')
- auth = {}
- ## should be changed to separate node.conf file
- auth['Username'] = self.config.main.pl_username
- auth['AuthString'] = self.config.main.pl_password
- auth['AuthMethod'] = "password"
- authorized = api_server.AuthCheck(auth)
-
- if authorized:
- print 'We are authorized!'
- return auth
- else:
- print 'Authorization failed. Please check your settings for pl_username and pl_password in the ooni-probe.conf file.'
-
- def _search_for_nodes(self, node_filter=None):
- api_server = xmlrpclib.ServerProxy('https://www.planet-lab.org/PLCAPI/', allow_none=True)
- node_filter = {'hostname': '*.cert.org.cn'}
- return_fields = ['hostname', 'site_id']
- all_nodes = api_server.GetNodes(self.api_auth(), node_filter, boot_state_filter)
- pprint(all_nodes)
- return all_nodes
-
- def _add_nodes_to_slice(self):
- api_server = xmlrpclib.ServerProxy('https://www.planet-lab.org/PLCAPI/', allow_none=True)
- all_nodes = self.search_for_nodes()
- for node in all_nodes:
- api_server.AddNode(self.api_auth(), node['site_id'], all_nodes)
- print 'Adding nodes %s' % node['hostname']
-
- def _auth_login(slicename, machinename):
- """Attempt to authenticate to the given PL node, slicename and
- machinename, using any of the private keys in ~/.ssh/ """
-
- agent = paramiko.Agent()
- agent_keys = agent.get_keys()
- if len(agent_keys) == 0:
- return
-
- for key in agent_keys:
- print 'Trying ssh-agent key %s' % hexlify(key.get_fingerprint()),
- try:
- paramiko.transport.auth_publickey(machinename, slicename)
- print 'Public key authentication to PlanetLab node %s successful.' % machinename,
- return
- except paramiko.SSHException:
- print 'Public key authentication to PlanetLab node %s failed.' % machinename,
-
- def _get_command():
- pass
-
- def ssh_and_run_(slicename, machinename, command):
- """Attempt to make a standard OpenSSH client to PL node, and run
- commands from a .conf file."""
-
- ## needs a way to specify 'ssh -l <slicename> <machinename>'
- ## with public key authentication.
-
- command = PlanetLab.get_command()
-
- client = paramiko.SSHClient()
- client.load_system_host_keys()
- client.connect(machinename)
-
- stdin, stdout, stderr = client.exec_command(command)
-
- def send_files_to_node(directory, files):
- """Attempt to rsync a tree to the PL node."""
- pass
-
- def add_unit():
- pass
-
- def get_status():
- pass
diff --git a/ooni/plugoo/reports.py b/ooni/plugoo/reports.py
deleted file mode 100644
index 1bfdac0..0000000
--- a/ooni/plugoo/reports.py
+++ /dev/null
@@ -1,145 +0,0 @@
-from __future__ import with_statement
-
-import os
-import yaml
-
-import itertools
-from ooni.utils import log, date, net
-
-class Report:
- """This is the ooni-probe reporting mechanism. It allows
- reporting to multiple destinations and file formats.
-
- :scp the string of <host>:<port> of an ssh server
-
- :yaml the filename of a the yaml file to write
-
- :file the filename of a simple txt file to write
-
- :tcp the <host>:<port> of a TCP server that will just listen for
- inbound connection and accept a stream of data (think of it
- as a `nc -l -p <port> > filename.txt`)
- """
- def __init__(self, testname=None, file="report.log",
- scp=None,
- tcp=None):
-
- self.testname = testname
- self.file = file
- self.tcp = tcp
- self.scp = scp
- #self.config = ooni.config.report
-
- #if self.config.timestamp:
- # tmp = self.file.split('.')
- # self.file = '.'.join(tmp[:-1]) + "-" + \
- # datetime.now().isoformat('-') + '.' + \
- # tmp[-1]
- # print self.file
-
- self.scp = None
- self.write_header()
-
- def write_header(self):
- pretty_date = date.pretty_date()
- header = "# OONI Probe Report for Test %s\n" % self.testname
- header += "# %s\n\n" % pretty_date
- self._write_to_report(header)
- # XXX replace this with something proper
- address = net.getClientAddress()
- test_details = {'start_time': str(date.now()),
- 'asn': address['asn'],
- 'test_name': self.testname,
- 'addr': address['ip']}
- self(test_details)
-
- def _write_to_report(self, dump):
- reports = []
-
- if self.file:
- reports.append("file")
-
- if self.tcp:
- reports.append("tcp")
-
- if self.scp:
- reports.append("scp")
-
- #XXX make this non blocking
- for report in reports:
- self.send_report(dump, report)
-
- def __call__(self, data):
- """
- This should be invoked every time you wish to write some
- data to the reporting system
- """
- dump = yaml.dump([data])
- self._write_to_report(dump)
-
- def file_report(self, data):
- """
- This reports to a file in YAML format
- """
- with open(self.file, 'a+') as f:
- f.write(data)
-
- def send_report(self, data, type):
- """
- This sends the report using the
- specified type.
- """
- #print "Reporting %s to %s" % (data, type)
- log.msg("Reporting to %s" % type)
- getattr(self, type+"_report").__call__(data)
-
-class NewReport(object):
- filename = 'report.log'
- startTime = None
- endTime = None
- testName = None
- ipAddr = None
- asnAddr = None
-
- def _open():
- self.fp = open(self.filename, 'a+')
-
- @property
- def header():
- pretty_date = date.pretty_date()
- report_header = "# OONI Probe Report for Test %s\n" % self.testName
- report_header += "# %s\n\n" % pretty_date
- test_details = {'start_time': self.startTime,
- 'asn': asnAddr,
- 'test_name': self.testName,
- 'addr': ipAddr}
- report_header += yaml.dump([test_details])
- return report_header
-
- def create():
- """
- Create a new report by writing it's header.
- """
- self.fp = open(self.filename, 'w+')
- self.fp.write(self.header)
-
- def exists():
- """
- Returns False if the file does not exists.
- """
- return os.path.exists(self.filename)
-
- def write(data):
- """
- Write a report to the file.
-
- :data: python data structure to be written to report.
- """
- if not self.exists():
- self.create()
- else:
- self._open()
- yaml_encoded_data = yaml.dump([data])
- self.fp.write(yaml_encoded_data)
- self.fp.close()
-
diff --git a/ooni/plugoo/tests.py b/ooni/plugoo/tests.py
deleted file mode 100644
index 653dd67..0000000
--- a/ooni/plugoo/tests.py
+++ /dev/null
@@ -1,142 +0,0 @@
-import os
-import yaml
-from zope.interface import Interface, Attribute
-
-import logging
-import itertools
-from twisted.internet import reactor, defer, threads
-## XXX why is this imported and not used?
-from twisted.python import failure
-
-from ooni.utils import log, date
-from ooni.plugoo import assets, work
-from ooni.plugoo.reports import Report
-from ooni.plugoo.interface import ITest
-
-
-class OONITest(object):
- """
- This is the base class for writing OONI Tests.
-
- It should be used in conjunction with the ITest Interface. It allows the
- developer to benefit from OONIs reporting system and command line argument
- parsing system.
- """
- name = "oonitest"
- # By default we set this to False, meaning that we don't block
- blocking = False
- reactor = reactor
- tool = False
- ended = False
-
- def __init__(self, local_options, global_options, report, ooninet=None,
- reactor=reactor):
- # These are the options that are read through the tests suboptions
- self.local_options = local_options
- # These are the options global to all of OONI
- self.global_options = global_options
- self.report = report
- #self.ooninet = ooninet
- self.reactor = reactor
- self.result = {}
- self.initialize()
- self.assets = self.load_assets()
-
- def initialize(self):
- """
- Override this method if you are interested in having some extra
- behavior when your test class is instantiated.
- """
- pass
-
- def load_assets(self):
- """
- This method should be overriden by the test writer to provide the
- logic for loading their assets.
- """
- return {}
-
- def __repr__(self):
- return "<OONITest %s %s %s>" % (self.local_options,
- self.global_options,
- self.assets)
-
- def end(self):
- """
- State that the current test should finish.
- """
- self.ended = True
-
- def finished(self, return_value):
- """
- The Test has finished running, we must now calculate the test runtime
- and add all time data to the report.
- """
- #self.ooninet.report(result)
- self.end_time = date.now()
- result = self.result
- result['start_time'] = str(self.start_time)
- result['end_time'] = str(self.end_time)
- result['run_time'] = str(self.end_time - self.start_time)
- result['return_value'] = return_value
- log.msg("FINISHED %s" % result)
- self.report(result)
- return result
-
- def _do_experiment(self, args):
- """
- A wrapper around the launch of experiment.
- If we are running a blocking test experiment will be run in a thread if
- not we expect it to return a Deferred.
-
- @param args: the asset line(s) that we are working on.
-
- returns a deferred.
- """
- if self.blocking:
- self.d = threads.deferToThread(self.experiment, args)
- else:
- self.d = self.experiment(args)
-
- self.d.addCallback(self.control, args)
- self.d.addCallback(self.finished)
- self.d.addErrback(self.finished)
- return self.d
-
- def control(self, result, args):
- """
- Run the control.
-
- @param result: what was returned by experiment.
-
- @param args: the asset(s) lines that we are working on.
- """
- log.msg("Doing control")
- return result
-
- def experiment(self, args):
- """
- Run the experiment. This sample implementation returns a deferred,
- making it a non-blocking test.
-
- @param args: the asset(s) lines that we are working on.
- """
- log.msg("Doing experiment")
- d = defer.Deferred()
- return d
-
- def startTest(self, args):
- """
- This method is invoked by the worker to start the test with one line of
- the asset file.
-
- @param args: the asset(s) lines that we are working on.
- """
- self.start_time = date.now()
-
- if self.shortName:
- log.msg("Starting test %s" % self.shortName)
- else:
- log.msg("Starting test %s" % self.__class__)
-
- return self._do_experiment(args)
diff --git a/ooni/plugoo/work.py b/ooni/plugoo/work.py
deleted file mode 100644
index db88fbf..0000000
--- a/ooni/plugoo/work.py
+++ /dev/null
@@ -1,148 +0,0 @@
-# -*- coding: UTF-8
-"""
- work.py
- **********
-
- This contains all code related to generating
- Units of Work and processing it.
-
- :copyright: (c) 2012 by Arturo Filastò.
- :license: see LICENSE for more details.
-
-"""
-import itertools
-import yaml
-from datetime import datetime
-
-from zope.interface import Interface, Attribute
-
-from twisted.python import failure
-from twisted.internet import reactor, defer
-
-class Worker(object):
- """
- This is the core of OONI. It takes as input Work Units and
- runs them concurrently.
- """
- def __init__(self, maxconcurrent=10, reactor=reactor):
- """
- @param maxconcurrent: how many test instances should be run
- concurrently.
- """
- self.reactor = reactor
- self.maxconcurrent = maxconcurrent
- self._running = 0
- self._queued = []
-
- def _run(self, r):
- """
- Check if we should start another test because we are below maximum
- concurrency.
-
- This function is called every time a test finishes running.
-
- @param r: the return value of a previous test.
- """
- if self._running > 0:
- self._running -= 1
-
- if self._running < self.maxconcurrent and self._queued:
- workunit, d = self._queued.pop(0)
- asset, test, idx = workunit
- while test.ended and workunit:
- try:
- workunit, d = self._queued.pop(0)
- asset, test, idx = workunit
- except:
- workunit = None
-
- if not test.ended:
- self._running += 1
- actuald = test.startTest(asset).addBoth(self._run)
-
- if isinstance(r, failure.Failure):
- # XXX probably we should be doing something to retry test running
- r.trap()
-
- if self._running == 0 and not self._queued:
- self.reactor.stop()
-
- return r
-
- def push(self, workunit):
- """
- Add a test to the test queue and run it if we are not maxed out on
- concurrency.
-
- @param workunit: a tuple containing the (asset, test, idx), where asset
- is the line of the asset(s) we are working on, test
- is an instantiated test and idx is the index we are
- currently at.
- """
- if self._running < self.maxconcurrent:
- asset, test, idx = workunit
- if not test.ended:
- self._running += 1
- return test.startTest(asset).addBoth(self._run)
-
- d = defer.Deferred()
- self._queued.append((workunit, d))
- return d
-
-class WorkGenerator(object):
- """
- Factory responsible for creating units of work.
-
- This shall be run on the machine running OONI-cli. The returned WorkUnits
- can either be run locally or on a remote OONI Node or Network Node.
- """
- size = 10
-
- def __init__(self, test, arguments=None, start=None):
- self.Test = test
-
- if self.Test.assets and self.Test.assets.values()[0]:
- self.assetGenerator = itertools.product(*self.Test.assets.values())
- else:
- self.assetGenerator = None
-
- self.assetNames = self.Test.assets.keys()
-
- self.idx = 0
- self.end = False
- if start:
- self.skip(start)
-
- def __iter__(self):
- return self
-
- def skip(self, start):
- """
- Skip the first x number of lines of the asset.
-
- @param start: int how many items we should skip.
- """
- for j in xrange(0, start-1):
- for i in xrange(0, self.size):
- self.assetGenerator.next()
- self.idx += 1
-
- def next(self):
- if self.end:
- raise StopIteration
-
- if not self.assetGenerator:
- self.end = True
- return ({}, self.Test, self.idx)
-
- try:
- asset = self.assetGenerator.next()
- ret = {}
- for i, v in enumerate(asset):
- ret[self.assetNames[i]] = v
- except StopIteration:
- raise StopIteration
-
- self.idx += 1
- return (ret, self.Test, self.idx)
-
diff --git a/ooni/protocols/http.py b/ooni/protocols/http.py
deleted file mode 100644
index 569c382..0000000
--- a/ooni/protocols/http.py
+++ /dev/null
@@ -1,141 +0,0 @@
-import random
-from zope.interface import implements
-from twisted.python import usage
-from twisted.plugin import IPlugin
-from twisted.internet import protocol, defer
-from ooni.plugoo.tests import ITest, OONITest
-from ooni.plugoo.assets import Asset
-from ooni.utils import log
-
-useragents = [("Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6", "Firefox 2.0, Windows XP"),
- ("Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)", "Internet Explorer 7, Windows Vista"),
- ("Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)", "Internet Explorer 7, Windows XP"),
- ("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)", "Internet Explorer 6, Windows XP"),
- ("Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 5.1; .NET CLR 1.1.4322)", "Internet Explorer 5, Windows XP"),
- ("Opera/9.20 (Windows NT 6.0; U; en)", "Opera 9.2, Windows Vista"),
- ("Opera/9.00 (Windows NT 5.1; U; en)", "Opera 9.0, Windows XP"),
- ("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 8.50", "Opera 8.5, Windows XP"),
- ("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 8.0", "Opera 8.0, Windows XP"),
- ("Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1) Opera 7.02 [en]", "Opera 7.02, Windows XP"),
- ("Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20060127 Netscape/8.1", "Netscape 8.1, Windows XP")]
-
-class BodyReceiver(protocol.Protocol):
- def __init__(self, finished):
- self.finished = finished
- self.data = ""
-
- def dataReceived(self, bytes):
- self.data += bytes
-
- def connectionLost(self, reason):
- self.finished.callback(self.data)
-
-from twisted.web.http_headers import Headers
-class HTTPTest(OONITest):
- """
- A utility class for dealing with HTTP based testing. It provides methods to
- be overriden for dealing with HTTP based testing.
- The main functions to look at are processResponseBody and
- processResponseHeader that are invoked once the headers have been received
- and once the request body has been received.
- """
- randomize_ua = True
- follow_redirects = False
-
- def initialize(self):
- from twisted.web.client import Agent
- import yaml
-
- self.agent = Agent(self.reactor)
- if self.follow_redirects:
- from twisted.web.client import RedirectAgent
- self.agent = RedirectAgent(self.agent)
-
- self.request = {}
- self.response = {}
-
- def _processResponseBody(self, data):
- self.response['body'] = data
- self.result['response'] = self.response
- self.processResponseBody(data)
-
- def processResponseBody(self, data):
- """
- This should handle all the response body smushing for getting it ready
- to be passed onto the control.
-
- @param data: The content of the body returned.
- """
- pass
-
- def processResponseHeaders(self, headers):
- """
- This should take care of dealing with the returned HTTP headers.
-
- @param headers: The content of the returned headers.
- """
- pass
-
- def processRedirect(self, location):
- """
- Handle a redirection via a 3XX HTTP status code.
-
- @param location: the url that is being redirected to.
- """
- pass
-
- def doRequest(self, url):
- d = self.build_request(url)
- def finished(data):
- return data
-
- d.addCallback(self._cbResponse)
- d.addCallback(finished)
- return d
-
- def experiment(self, args):
- log.msg("Running experiment")
- url = self.local_options['url'] if 'url' not in args else args['url']
-
- d = self.doRequest(url)
- return d
-
- def _cbResponse(self, response):
- self.response['headers'] = list(response.headers.getAllRawHeaders())
- self.response['code'] = response.code
- self.response['length'] = response.length
- self.response['version'] = response.length
-
- if str(self.response['code']).startswith('3'):
- self.processRedirect(response.headers.getRawHeaders('Location')[0])
- self.processResponseHeaders(self.response['headers'])
- #self.result['response'] = self.response
-
- finished = defer.Deferred()
- response.deliverBody(BodyReceiver(finished))
- finished.addCallback(self._processResponseBody)
-
- def randomize_useragent(self):
- user_agent = random.choice(useragents)
- self.request['headers']['User-Agent'] = [user_agent]
-
- def build_request(self, url, method="GET", headers=None, body=None):
- self.request['method'] = method
- self.request['url'] = url
- self.request['headers'] = headers if headers else {}
- self.request['body'] = body
- if self.randomize_ua:
- self.randomize_useragent()
-
- self.result['request'] = self.request
- self.result['url'] = url
- return self.agent.request(self.request['method'], self.request['url'],
- Headers(self.request['headers']),
- self.request['body'])
-
- def load_assets(self):
- if self.local_options:
- return {'url': Asset(self.local_options['asset'])}
- else:
- return {}
-
diff --git a/ooni/protocols/scapyproto.py b/ooni/protocols/scapyproto.py
deleted file mode 100644
index 4166146..0000000
--- a/ooni/protocols/scapyproto.py
+++ /dev/null
@@ -1,55 +0,0 @@
-import random
-from zope.interface import implements
-from twisted.python import usage
-from twisted.plugin import IPlugin
-from twisted.internet import protocol, defer
-from ooni.plugoo.tests import ITest, OONITest
-from ooni.plugoo.assets import Asset
-from ooni.utils import log
-
-from ooni.lib.txscapy import txsr, txsend
-
-class ScapyTest(OONITest):
- """
- A utility class for writing scapy driven OONI tests.
- """
-
- receive = True
- timeout = None
- pcapfile = 'scapytest.pcap'
- def initialize(self, reactor=None):
-
- if not self.reactor:
- from twisted.internet import reactor
- self.reactor = reactor
-
- self.request = {}
- self.response = {}
-
- def experiment(self, args):
- log.msg("Running experiment")
- if self.receive:
- log.msg("Sending and receiving packets.")
- d = txsr(self.build_packets(), pcapfile=self.pcapfile,
- timeout=self.timeout)
- else:
- log.msg("Sending packets.")
- d = txsend(self.build_packets())
-
- def finished(data):
- log.msg("Finished sending")
- return data
-
- d.addCallback(finished)
- return d
-
- def build_packets(self):
- """
- Override this method to build scapy packets.
- """
- from scapy.all import IP, TCP
- return IP()/TCP()
-
- def load_assets(self):
- return {}
-
diff --git a/ooni/reporter.py b/ooni/reporter.py
index ad7956d..a02e5a9 100644
--- a/ooni/reporter.py
+++ b/ooni/reporter.py
@@ -273,18 +273,14 @@ class OONIReporter(OReporter):
idx = self.getTestIndex(test)
- self._tests[idx]['last_time'] = self._getTime() - self._tests[idx]['test_started']
- # This is here for allowing reporting of legacy tests.
- # XXX In the future this should be removed.
- try:
- report = list(test.legacy_report)
- log.debug("Set the report to be a list")
- except:
- # XXX I put a dict() here so that the object is re-instantiated and I
- # actually end up with the report I want. This could either be a
- # python bug or a yaml bug.
- report = dict(test.report)
- log.debug("Set the report to be a dict")
+ self._tests[idx]['last_time'] = self._getTime() - \
+ self._tests[idx]['test_started']
+
+ # XXX I put a dict() here so that the object is re-instantiated and I
+ # actually end up with the report I want. This could either be a
+ # python bug or a yaml bug.
+ report = dict(test.report)
+ log.debug("Set the report to be a dict")
log.debug("Adding to report %s" % report)
self._tests[idx]['report'] = report
diff --git a/ooni/runner.py b/ooni/runner.py
index fa50840..102ff29 100644
--- a/ooni/runner.py
+++ b/ooni/runner.py
@@ -20,25 +20,9 @@ from twisted.trial.runner import filenameToModule
from ooni.inputunit import InputUnitFactory
from ooni.nettest import InputTestSuite
-from ooni.plugoo import tests as oonitests
-
from ooni.reporter import ReporterFactory
from ooni.utils import log, date
-from ooni.utils.legacy import LegacyOONITest
-from ooni.utils.legacy import start_legacy_test, adapt_legacy_test
-
-def isLegacyTest(obj):
- """
- Returns True if the test in question is written using the OONITest legacy
- class.
- We do this for backward compatibility of the OONIProbe API.
- """
- try:
- return issubclass(obj, oonitests.OONITest) and not obj == oonitests.OONITest
- except TypeError:
- return False
-
def processTest(obj, config):
"""
Process the parameters and :class:`twisted.python.usage.Options` of a
@@ -115,9 +99,6 @@ def findTestClassesFromConfig(config):
if isTestCase(val):
log.debug("Detected TestCase %s" % val)
classes.append(processTest(val, config))
- elif isLegacyTest(val):
- log.debug("Detected Legacy Test %s" % val)
- classes.append(adapt_legacy_test(val, config))
return classes
def makeTestCases(klass, tests, method_prefix):
@@ -141,38 +122,18 @@ def loadTestsAndOptions(classes, config):
options = []
test_cases = []
- _old_klass_type = LegacyOONITest
-
for klass in classes:
- if isinstance(klass, _old_klass_type):
- try:
- cases = start_legacy_test(klass)
- if cases:
- log.debug("Processing cases")
- log.debug(str(cases))
- return [], []
- test_cases.append(cases)
- except Exception, e:
- log.err(e)
- else:
- try:
- opts = klass.local_options
- options.append(opts)
- except AttributeError, ae:
- options.append([])
- log.err(ae)
- else:
- tests = reflect.prefixedMethodNames(klass, method_prefix)
- if tests:
- cases = makeTestCases(klass, tests, method_prefix)
- test_cases.append(cases)
- try:
- k = klass()
- opts = k.getOptions()
- options.append(opts)
- except AttributeError, ae:
- options.append([])
- log.err(ae)
+ tests = reflect.prefixedMethodNames(klass, method_prefix)
+ if tests:
+ cases = makeTestCases(klass, tests, method_prefix)
+ test_cases.append(cases)
+ try:
+ k = klass()
+ opts = k.getOptions()
+ options.append(opts)
+ except AttributeError, ae:
+ options.append([])
+ log.err(ae)
return test_cases, options
diff --git a/ooni/scaffolding.py b/ooni/scaffolding.py
deleted file mode 100644
index dffe342..0000000
--- a/ooni/scaffolding.py
+++ /dev/null
@@ -1,78 +0,0 @@
-#!/usr/bin/env python
-
-"""
-This script should be used for creating the scaffolding for a test.
-"""
-from __future__ import print_function
-import os
-import sys
-from ooni.utils import log
-
-print("!!!! This test writing strategy is now deprecated !!!")
-print("visit: https://ooni.readthedocs.org/en/latest/writing_tests.html "
- "for new instructions")
-sys.exit(1)
-
-test_template = """\"\"\"
-This is a self genrated test created by scaffolding.py.
-you will need to fill it up with all your necessities.
-Safe hacking :).
-\"\"\"
-from zope.interface import implements
-from twisted.python import usage
-from twisted.plugin import IPlugin
-from ooni.plugoo.tests import ITest, OONITest
-from ooni.plugoo.assets import Asset
-from ooni.utils import log
-
-class %(testShortname)sArgs(usage.Options):
- optParameters = [['asset', 'a', None, 'Asset file'],
- ['resume', 'r', 0, 'Resume at this index']]
-
-class %(testShortname)sTest(OONITest):
- implements(IPlugin, ITest)
-
- shortName = "%(testSNlower)s"
- description = "%(testName)s"
- requirements = None
- options = %(testShortname)sArgs
- blocking = True
-
- def control(self, experiment_result, args):
- # What you return here ends up inside of the report.
- log.msg("Running control")
- return {}
-
- def experiment(self, args):
- # What you return here gets handed as input to control
- log.msg("Running experiment")
- return {}
-
- def load_assets(self):
- if self.local_options:
- return {'asset': Asset(self.local_options['asset'])}
- else:
- return {}
-
-# We need to instantiate it otherwise getPlugins does not detect it
-# XXX Find a way to load plugins without instantiating them.
-%(testShortname)s = %(testShortname)sTest(None, None, None)
-"""
-
-test_vars = {'testName': None, 'testShortname': None}
-test_vars['testName'] = raw_input('Test Name: ')
-test_vars['testShortname'] = raw_input("Test Short Name: ")
-test_vars['testSNlower'] = test_vars['testShortname'].lower()
-
-fname = os.path.join('plugins', test_vars['testSNlower']+'.py')
-
-if os.path.exists(fname):
- print('WARNING! File named "%s" already exists.' % fname)
- if raw_input("Do you wish to continue (y/N)? ").lower() != 'y':
- print("gotcha! Dying..")
- sys.exit(0)
-
-fp = open(fname, 'w')
-fp.write(test_template % test_vars)
-fp.close()
-
diff --git a/ooni/utils/legacy.py b/ooni/utils/legacy.py
deleted file mode 100755
index 3e21d97..0000000
--- a/ooni/utils/legacy.py
+++ /dev/null
@@ -1,459 +0,0 @@
-# -*- coding: UTF-8
-#
-# Open Observatory of Network Interference
-# ****************************************
-#
-# legacy.py
-# ---------
-# Utilities for working with legacy OONI tests, i.e. tests which were created
-# before the transition to the new twisted.trial based API.
-#
-# "The Net interprets censorship as damage and routes around it."
-# - John Gilmore; TIME magazine (6 December 1993)
-#
-# :authors: Isis Lovecruft, Arturo Filasto
-# :license: see included LICENSE file
-# :copyright: (c) 2012 Isis Lovecruft, Arturo Filasto, The Tor Project, Inc.
-# :version: 0.1.0-pre-alpha
-#
-# This API has been deprecated and is merely for API purposes.
-#
-
-__VERSION__="0.0.1-pre-alpha"
-
-import inspect
-import os
-import yaml
-
-from twisted.internet import defer, reactor
-from twisted.python import usage
-from twisted.python import log as tplog
-from twisted.python.usage import Options as tpOptions
-
-from ooni import nettest
-from ooni.plugoo.tests import OONITest
-from ooni.plugoo import work, reports
-from ooni.utils import log, date
-from ooni.utils.logo import getlogo
-
-
-def runTest(test, options, global_options, reactor=reactor):
- """
- Run an OONI test by name.
-
- @param test:
- a string specifying the test name as specified inside
- of shortName.
- @param options:
- the local options to be passed to the test.
- @param global_options: the global options for OONI.
- """
- parallelism = int(global_options['parallelism'])
- worker = work.Worker(parallelism, reactor=reactor)
- test_class = test.__class__
- report = reports.Report(test, global_options['output'])
-
- log_to_stdout = True
- if global_options['quiet']:
- log_to_stdout = False
-
- log.start(log_to_stdout,
- global_options['log'],
- global_options['verbosity'])
-
- resume = 0
- if not options:
- options = {}
- if 'resume' in options:
- resume = options['resume']
-
- test = test_class(options, global_options, report, reactor=reactor)
- if test.tool:
- test.runTool()
- return True
-
- if test.ended:
- print "Ending test"
- return None
-
- wgen = work.WorkGenerator(test, dict(options), start=resume)
- for x in wgen:
- worker.push(x)
-
-
-class LegacyOptions(usage.Options):
- """Deprecated."""
- def __init__(test_classes=[], sub_commands=[]):
- self.test_classes = test_classes
- self.sub_commands = sub_commands
- for cls in self.test_classes:
- sub_commands.append([cls, None, cls.options,
- "Run the %s test" % cls])
- optParameters = [
- ['parallelism', 'n', 10, "Specify the number of parallel tests to run"],
- ['output', 'o', 'report.log', "Specify output report file"],
- ['log', 'l', 'oonicli.log', "Specify output log file"],
- ['verbosity', 'v', 1, "Specify the logging level"]]
- optFlags = [['quiet', 'q', "Don't log to stdout"]]
-
- def opt_version(self):
- """
- This API has been deprecated; please use the new alpha-release API.
- See /nettests in the top directory, as well as the /docs folder for
- further information.
- """
- print "OONI version: %s\n\n%s" % (__VERSION__, __doc__)
- sys.exit(0)
-
- def __str__(self):
- """
- Hack to get the sweet ascii art into the help output and replace the
- strings "Commands" with "Tests".
- """
- return getlogo() + '\n' + self.getSynopsis() + '\n' + \
- self.getUsage(width=None).replace("Commands:", "Tests:")
-
-def run_ooniprobe_py(*args):
- log.start()
- if not args:
- args = "--help"
- old_api = usage.Options()
- try:
- old_api.parseOptions()
- except:
- log.msg("Use of this API is deprecated. Please use /bin/ooniprobe.")
- runTest(old_api.sub_command, old_api.subOptions, old_api)
- reactor.run()
-
-class LegacyReporter(object):
- """
- Backwards compatibility class for creating a report object for results
- from a :class:`ooni.runner.LegacyTest`. A
- :class:`ooni.runner.LegacyReporter` object will eventually get wrapped in
- a list when :mod:`ooni.oonicli` calls
- :meth:`ooni.reporter.OONIReporter.stopTest`.
-
- :param report_target:
- The type of object to write results to, by default a list.
- """
- def __init__(self, report_target=[]):
- self.report_target = report_target
- if isinstance(self.report_target, dict):
- self._type = dict
- elif isinstance(self.report_target, list):
- self._type = list
- else:
- self._type = type(self.report_target)
-
- def __call__(self, info):
- if self._type is dict:
- self.report_target.update(info)
- elif self._type is list:
- self.report_target.append(info)
- else:
- log.debug("ADD A NEW REPORT_TARGET TYPE!!")
-
-class LegacyOONITest(nettest.NetTestCase):
- """
- Converts an old test, which should be a subclass of
- :class:`ooni.plugoo.tests.OONITest`, to an :mod:`ooni.oonicli`
- compatible class.
-
- :param obj:
- An uninstantiated old test, which should be a subclass of
- :class:`ooni.plugoo.tests.OONITest`.
- :param config:
- A configured and instantiated :class:`twisted.python.usage.Options`
- class.
- :meth start_legacy_test:
- Handler for calling :meth:`ooni.plugoo.tests.OONITest.startTest`.
- """
-
- ## we need __bases__ because inspect.getmro() as well as
- ## zope.interface.implements() both expect it:
- from ooni.plugoo.tests import OONITest
- __bases__ = (OONITest, )
-
- def __getattr__(self, name):
- """
- Override of builtin getattr for :class:`ooni.runner.LegacyTest` so
- that method calls to a LegacyTest instance or its parent class
- OONITest do not return unhandled errors, but rather report that the
- method is unknown.
- """
- def __unknown_method__(*a):
- log.msg("Call to unknown method %s.%s" % (self.originalTest, name))
- if a:
- log.msg("Unknown method %s parameters: %s" % str(a))
- return __unknown_method__
-
- def find_missing_options(self):
- """
- In the case that our test is actually a class within a module named
- after itself, i.e. 'ooni.plugins.bridget.bridget', we want dynamic
- method discover so that we can search for the test's Options class.
-
- Example:
- Let's say we want the Options class, which is at
- ``ooni.plugins.bridget.bridget.options``. But in this case, our
- original_test variable isn't going to have an attribute named
- 'options', because original_test is actually the *first* occurence of
- 'bridget'.
-
- In other words, our original_test is actually the module, so we need
- to find the test, which is done with:
-
- getattr(original_test.__class__, test_class)
-
- After that, we've got our test stored as something like
- ``ooni.plugins.bridget.bridget`` and we need to find 'options' as an
- attribute under that, which is what
-
- options_finder = inspect.attrgetter('options')
-
- is used for. And the namespace stuff is just used for debugging edge
- cases where we totally can't find the options.
-
- :ivar original_class:
- The original subclass of OONITest, except that in this case,
- because our test is a module, what we have here is
- 'ooni.plugins.bridget.BridgeTest', while we actually need
- something like 'ooni.plugins.bridget.bridget.BridgeTest' instead.
- :ivar class_string:
- The :ivar:`original_class` converted to a string.
- :ivar from_module:
- The parent module of :ivar:`original_class`, i.e.
- `ooni.plugins.bridget`.
- :ivar test_class:
- The last part of :ivar:`from_module`, ie. 'bridget'.
- :ivar options_finder:
- An instance of :meth:`inspect.attrgetter` which searches for
- methods within a test class named 'options'.
- """
- original_test = self.originalTest
- original_class = original_test.__class__
- class_string = str(original_class)
- from_module = inspect.getmodule(original_class)
- test_class = class_string.rsplit('.', 1)[1]
- options_finder = inspect.attrgetter('options')
-
- if self.was_named is False or self.name != test_class:
- log.msg("Discovered legacy test named %s ..." % test_class)
- setattr(self, 'name', test_class)
-
- try:
- namespace = globals()[class_string]
- log.debug("orginal namespace: %s" % namespace)
- except KeyError, keyerr:
- log.debug(keyerr)
-
- options = tpOptions
- try:
- options = options_finder(getattr(original_class, test_class))
- except AttributeError:
- self.__getattr__(test_class)
- except Exception, e:
- log.err(e)
- finally:
- return options()
-
- def __init__(self, obj, config):
- """
- xxx fill me in
-
- :param obj:
- An uninstantiated old test, which should be a subclass of
- :class:`ooni.plugoo.tests.OONITest`.
- :param config:
- A configured and instantiated
- :class:`twisted.python.usage.Options` class.
- :attr originalTest:
- :attr subArgs:
- :attr name:
- :ivar was_named:
- :attr subOptions:
- """
- super(LegacyOONITest, self).__init__()
- self.originalTest = obj
- self.start_time = date.now()
- self.name = 'LegacyOONITest'
- self.was_named = False
- try:
- self.name = self.originalTest.shortName
- self.was_named = True
- except AttributeError:
- if self.originalTest.name and self.originalTest.name != 'oonitest':
- self.name = self.originalTest.name
- self.was_named = True
-
- if 'subArgs' in config:
- self.subArgs = config['subArgs']
- else:
- self.subArgs = (None, )
- log.msg("No suboptions to test %s found; continuing..."% self.name)
-
- try:
- self.subOptions = self.originalTest.options()
- except AttributeError:
- if self.was_named is False:
- self.subOptions = self.find_missing_options()
- else:
- self.subOptions = None
- log.msg("That test appears to have a name, but no options!")
-
- if self.subOptions is not None:
- if len(self.subArgs) > 0:
- self.subOptions.parseOptions(self.subArgs)
- self.local_options = self.subOptions
- else:
- print self.subOptions
-
- if 'reportfile' in config:
- self.reporter_file = config['reportfile']
- else:
- filename = str(self.name) + "-" + str(date.timestamp()) + ".yaml"
- self.reporter_file = os.path.join(os.getcwd(), filename)
- self.reporter = []
- self.report = LegacyReporter(report_target=self.reporter)
-
- self.legacy_test = self.originalTest(None, self.local_options,
- None, self.report)
- setattr(self.legacy_test, 'name', self.name)
- setattr(self.legacy_test, 'start_time', self.start_time)
-
- self.inputs = {}
- for keys, values in self.legacy_test.assets.items():
- self.inputs[keys] = values
- setattr(self.legacy_test, 'inputs', self.inputs)
-
- @defer.inlineCallbacks
- def run_with_args(self, args):
- """
- Handler for calling :meth:`ooni.plugoo.tests.OONITest.startTest` with
- each :param:`args` that, in the old framework, would have been
- generated one line at a time by
- :class:`ooni.plugoo.assets.Asset`. This function is wrapped with
- :meth:`twisted.internet.defer.inlineCallbacks` so that the result of
- each call to :meth:`ooni.plugoo.tests.OONITest.experiment` is returned
- immediately as :ivar:`returned`.
- """
- result = yield self.legacy_test.startTest(args)
- defer.returnValue(result)
-
-def adapt_legacy_test(obj, config):
- """
- Wrapper function for taking a legacy OONITest class and converting it into
- a :class:`LegacyTest`, which is a variant of the new
- :class:`ooni.nettest.TestCase` and is compatible with
- :mod:`ooni.oonicli`. This allows for backward compatibility of old OONI
- tests.
-
- :param obj:
- An uninstantiated old test, which should be a subclass of
- :class:`ooni.plugoo.tests.OONITest`.
- :param config:
- A configured and instantiated :class:`twisted.python.usage.Options`
- class.
- :return:
- A :class:`LegacyOONITest`.
- """
- return LegacyOONITest(obj, config)
-
-def report_legacy_test_to_file(legacy_test, file=None):
- """
- xxx this function current does not get used, and could easily be handled
- by ooni.runner.loadTestsAndOptions, or some other function in
- ooni.runner.
-
- xxx fill me in
- """
- reporter_file = legacy_test.reporter_file
-
- if file is not None:
- base = os.path.dirname(os.path.abspath(file))
- if base.endswith("ooni") or base == os.getcwd():
- reporter_file = file
- else:
- log.msg("Writing to %s not allowed, using default file %s."
- % (base, reporter_file))
-
- yams = yaml.safe_dump(legacy_test.reporter)
- with open(reporter_file, 'a') as rosemary:
- rosemary.write(yams)
- rosemary.flush()
- log.msg("Finished reporting.")
-
-def log_legacy_test_results(result, legacy_test, args):
- """
- Callback function for deferreds in :func:`start_legacy_test` which
- handles updating the legacy_test's :class:`legacy_test.report`.
-
- :param result:
- The possible result of a deferred which has been returned from
- :meth:`ooni.plugoo.test.OONITest.experiment` and
- :meth:`ooni.plugoo.test.OONITest.control`.
- :param legacy_test:
- The :class:`LegacyOONITest` which we're processing.
- :param args:
- The current inputs which we're giving to legacy_test.startTest().
- :return:
- The :param:`legacy_test`.
- """
- if result:
- legacy_test.report({args: result})
- log.debug("Legacy test %s with args:\n%s\nreturned result:\n%s"
- % (legacy_test.name, args, result))
- else:
- legacy_test.report({args: None})
- log.debug("No results return for %s with args:\n%s"
- % (legacy_test.name, args))
- return legacy_test
-
-def start_legacy_test(legacy_test):
- """
- This is the main function which should be used to call a legacy test, it
- handles parsing the deprecated :class:`ooni.plugoo.assets.Asset` items as
- inputs, and calls back to a custom, backwards-compatible Reporter.
-
- For each input to the legacy_test, this function creates a
- :class:`twisted.internet.defer.Deferred` which has already received its
- :meth:`callback`. The end result is a
- :class:`twisted.internet.defer.gatherResults` of all the outcomes of
- :param:`legacy_test` for each of the inputs.
-
- :param legacy_test:
- A :class:`LegacyOONITest` to process.
- :ivar results:
- A list of :class:`twisted.internet.defer.Deferred`s which gets
- processed as a :class:`twisted.internet.defer.DeferredList`.
- :ivar current_input:
- The input we are current working on, i.e. what would have been 'args'
- (as in, 'experiment(args)') in the old design.
- :return:
- A :class:`twisted.internet.defer.gatherResults`.
- """
- results = []
- current_input = {}
-
- if len(legacy_test.inputs) > 0:
- for keys, values in legacy_test.inputs:
- for value in values:
- current_input[keys] = value
- log.debug("Running %s with args: %s"
- % (legacy_test.name, current_input))
- d = legacy_test.run_with_args(current_input)
- d.addCallback(log_legacy_test_results, legacy_test,
- current_input)
- d.addErrback(tplog.err)
- results.append(d)
- else:
- current_input['zero_input_test'] = True
- log.debug("Running %s with current input: %s"
- % (legacy_test.name, current_input))
- d = legacy_test.run_with_args(current_input)
- d.addCallback(log_legacy_test_results, legacy_test, current_input)
- d.addErrback(tplog.err)
- results.append(d)
-
- dlist = defer.gatherResults(results)
- return dlist
1
0

[ooni-probe/master] Remove raw inputs and move them to a separate repository
by art@torproject.org 07 Nov '12
by art@torproject.org 07 Nov '12
07 Nov '12
commit 92bbcb9b66b1eb1716bbc5f7d8ff2cf46c70347a
Author: Arturo Filastò <arturo(a)filasto.net>
Date: Wed Nov 7 01:36:08 2012 +0100
Remove raw inputs and move them to a separate repository
* Add Makefile to fetch such lists
---
inputs/Makefile | 3 +
inputs/captive_portal_tests.txt.good | 4 -
inputs/cctld.txt | 511 ----------------------
inputs/dns_servers.txt.bak | 6 -
inputs/dns_servers.txt.bak2 | 1 -
inputs/example_exp_list.txt | 3 -
inputs/major_isp_dns_servers.txt | 796 ----------------------------------
inputs/short_hostname_list.txt | 7 -
inputs/tld-list-cc.txt | 511 ----------------------
inputs/tld-list-mozilla.txt | 5 -
inputs/top-1m.txt.bak2 | 11 -
11 files changed, 3 insertions(+), 1855 deletions(-)
diff --git a/inputs/Makefile b/inputs/Makefile
new file mode 100644
index 0000000..c70ce59
--- /dev/null
+++ b/inputs/Makefile
@@ -0,0 +1,3 @@
+# This file will fetch a set of inputs that are of use to ooni-probe
+lists:
+ git clone https://github.com/hellais/ooni-inputs.git ooni-inputs
diff --git a/inputs/captive_portal_tests.txt.good b/inputs/captive_portal_tests.txt.good
deleted file mode 100644
index 1bd016f..0000000
--- a/inputs/captive_portal_tests.txt.good
+++ /dev/null
@@ -1,4 +0,0 @@
-
-http://ooni.nu, Open Observatory of Network Interference, 200
-http://www.patternsinthevoid.net/2CDB8B35pub.asc, mQINBE5qkHABEADVnasCm9w9hUff1E4iKnzcAdp4lx6XU5USmYdwKg2RQt2VFqWQ, 200
-http://www.google.com, Search the world's information, 200
diff --git a/inputs/cctld.txt b/inputs/cctld.txt
deleted file mode 100644
index 57e0cc8..0000000
--- a/inputs/cctld.txt
+++ /dev/null
@@ -1,511 +0,0 @@
-.ac = Ascension Island
-
-.ad = Andorra
-
-.ae = United Arab Emirates
-
-.af = Afghanistan
-
-.ag = Antigua and Barbuda
-
-.ai = Anguilla
-
-.al = Albania
-
-.am = Armenia
-
-.an = Netherlands Antilles
-
-.ao = Angola
-
-.aq = Antarctica - no registrar
-
-.ar = Argentina
-
-.as = American Samoa
-
-.at = Austria
-
-.au = Australia
-
-.aw = Aruba - no registrar
-
-.ax = Aland Islands
-
-.az = Azerbaijan - no registrar
-
-.ba = Bosnia and Herzegovina
-
-.bb = Barbados
-
-.bd = Bangladesh - no registrar
-
-.be = Belgium
-
-.bf = Burkina Faso - no registrar
-
-.bg = Bulgaria
-
-.bh = Bahrain
-
-.bi = Burundi
-
-.bj = Benin ... (little info) DETAILS
-
-.bm = Bermuda
-
-.bn = Brunei Darussalam
-
-.bo = Bolivia
-
-.br = Brazil
-
-.bs = Bahamas
-
-.bt = Bhutan
-
-.bv = Bouvet Island - not in use
-
-.bw = Botswana - no registrar
-
-.by = Belarus
-
-.bz = Belize
-
-.ca = Canada
-
-.cc = Cocos (Keeling) Islands
-
-.cd = The Democratic Republic of the Congo
-
-.cf = Central African Republic - no registrar
-
-.cg = Republic of Congo
-
-.ch = Switzerland
-
-.ci = Cote d'Ivoire
-
-.ck = Cook Islands
-
-.cl = Chile
-
-.cm = Cameroon - no registrar - wildcarded
-
-.cn = China
-
-.co = Colombia
-
-.cr = Costa Rica
-
-.cs = (former) Serbia and Montenegro - no registrar - see: .me
-(.cs was also formerly the ISO_3166-1 code for Czechoslovakia, now .cs is closed.)
-
-.cu = Cuba - no registrar
-
-.cv = Cape Verde - no registrar
-
-.cx = Christmas Island
-
-.cy = Cyprus
-
-.cz = Czech Republic
-
-.dd = East Germany (obsolete)
-
-.de = Germany
-
-.dj = Djibouti - no information
-
-.dk = Denmark
-
-.dm = Dominica
-
-.do = Dominican Republic
-
-.dz = Algeria - no registrar
-
-.ec = Ecuador
-
-.ee = Estonia
-
-.eg = Egypt - DETAILS
-
-.eh = Western Sahara - no registrar
-
-.er = Eritrea - no registrar
-
-.es = Spain
-
-.et = Ethiopia
-
-.eu = European Union - DETAILS
-
-.fi = Finland
-
-.fj = Fiji
-
-.fk = Falkland Islands (Malvinas)
-
-.fm = Micronesia, Federal State of
-
-.fo = Faroe Islands
-
-.fr = France
-
-.ga = Gabon - no registrar
-
-.gb = Great Britain (United Kingdom) - reserved, see .uk
-
-.gd = Grenada
-
-.ge = Georgia
-
-.gf = French Guiana
-
-.gg = Guernsey
-
-.gh = Ghana
-
-.gi = Gibraltar
-
-.gl = Greenland
-
-.gm = Gambia
-
-.gn = Guinea
-
-.gp = Guadeloupe - no information
-
-.gq = Equatorial Guinea - no information
-
-.gr = Greece
-
-.gs = South Georgia and the
-South Sandwich Islands
-
-.gt = Guatemala
-
-.gu = Guam
-
-.gw = Guinea-Bissau - no registrar
-
-.gy = Guyana - no registrar
-
-.hk = Hong Kong
-
-.hm = Heard and McDonald Islands
-
-.hn = Honduras
-
-.hr = Croatia/Hrvatska
-
-.ht = Haiti - no registrar
-
-.hu = Hungary
-
-.id = Indonesia - no information
-
-.ie = Ireland
-
-.il = Israel
-
-.im = Isle of Man
-
-.in = India
-
-.io = British Indian Ocean Territory
-
-.iq = Iraq - no registrar
-
-.ir = Islamic Republic of Iran
-
-.is = Iceland
-
-.it = Italy
-
-.je = Jersey
-
-.jm = Jamaica - no registrar
-
-.jo = Jordan
-
-.jp = Japan
-
-.ke = Kenya
-
-.kg = Kyrgyzstan - no registrar
-
-.kh = Cambodia
-
-.ki = Kiribati
-
-.km = Comoros
-
-.kn = Saint Kitts and Nevis - no registrar
-
-.kp = Democratic People's Republic of Korea
-(North) - no registrar
-
-.kr = Republic of Korea (South)
-
-.kw = Kuwait - no registrar
-
-.ky = Cayman Islands
-
-.kz = Kazakhstan
-
-.la = Lao People's Democratic Republic (Laos)
-... DETAILS
-
-.lb = Lebanon
-
-.lc = Saint Lucia
-
-.li = Liechtenstein
-
-.lk = Sri Lanka
-
-.lr = Liberia
-
-.ls = Lesotho - no registrar
-
-.lt = Lithuania
-
-.lu = Luxembourg
-
-.lv = Latvia
-
-.ly = Libyan Arab Jamahiriya (Libya)
-
-.ma = Morocco
-
-.mc = Monaco
-
-.md = Moldova
-
-.me = Montenegro
-
-.mg = Madagascar
-
-.mh = Marshall Islands
-
-.mk = Macedonia
-
-.ml = Mali - no information
-
-.mm = Myanmar (formerly Burma) - no registrar
-
-.mn = Mongolia
-
-.mo = Macau
-
-.mp = Northern Mariana Islands
-
-.mq = Martinique - no information
-
-.mr = Mauritania
-
-.ms = Montserrat
-
-.mt = Malta
-
-.mu = Mauritius
-
-.mv = Maldives - no registrar
-
-.mw = Malawi
-
-.mx = Mexico
-
-.my = Malaysia
-
-.mz = Mozambique - no registrar
-
-.na = Namibia
-
-.nc = New Caledonia
-
-.ne = Niger - no information
-
-.nf = Norfolk Island
-
-.ng = Nigeria
-
-.ni = Nicaragua
-
-.nl = Netherlands
-
-.no = Norway
-
-.np = Nepal
-
-.nr = Nauru
-
-.nu = Niue
-
-.nz = New Zealand
-
-.om = Oman - Omantel.net.om not functioning
-
-.pa = Panama
-
-.pe = Peru
-
-.pf = French Polynesia - no registrar
-
-.pg = Papua New Guinea - no registrar
-
-.ph = Philippines
-
-.pk = Pakistan
-
-.pl = Poland
-
-.pm = Saint Pierre and Miquelon - not available
-
-.pn = Pitcairn Island
-
-.pr = Puerto Rico
-
-.ps = Palestinian Territories
-
-.pt = Portugal
-
-.pw = Palau
-
-.py = Paraguay
-
-.qa = Qatar
-
-.re = Reunion Island
-
-.ro = Romania
-
-.rs = Serbia - no registrar
-
-.ru = Russian Federation
-
-.rw = Rwanda
-
-.sa = Saudi Arabia
-
-.sb = Solomon Islands
-
-.sc = Seychelles
-
-.sd = Sudan
-
-.se = Sweden
-
-.sg = Singapore
-
-.sh = Saint Helena
-
-.si = Slovenia
-
-.sj = Svalbard and Jan Mayen Islands - not in use
-
-.sk = Slovak Republic
-
-.sl = Sierra Leone
-
-.sm = San Marino
-
-.sn = Senegal - no registrar
-
-.so = Somalia - no registrar
-
-.sr = Suriname
-
-.st = Sao Tome and Principe
-
-.su = Soviet Union
-
-.sv = El Salvador
-
-.sy = Syrian Arab Republic
-
-.sz = Swaziland
-
-.tc = Turks and Caicos Islands - no registrar
-
-.td = Chad - no registrar
-
-.tf = French Southern Territories - no registrar
-
-.tg = Togo
-
-.th = Thailand
-
-.tj = Tajikistan
-
-.tk = Tokelau
-
-.tl = Timor-Leste
-
-.tm = Turkmenistan
-
-.tn = Tunisia
-
-.to = Tonga
-
-.tp = East Timor - Closed. See: Timor-Leste
-
-.tr = Turkey
-
-.tt = Trinidad and Tobago
-
-.tv = Tuvalu
-
-.tw = Taiwan
-
-.tz = Tanzania
-
-.ua = Ukraine
-
-.ug = Uganda
-
-.uk = United Kingdom
-
-.um = United States Minor Outlying Islands
-- Withdrawn, no domains exist.
-
-.us = United States (USA)
-
-.uy = Uruguay
-
-.uz = Uzbekistan
-
-.va = Holy See (Vatican City State)- no registrar
-
-.vc = Saint Vincent and the Grenadines
-
-.ve = Venezuela
-
-.vg = British Virgin Islands
-
-.vi = U.S. Virgin Islands
-
-.vn = Vietnam
-
-.vu = Vanuatu
-
-.wf = Wallis and Futuna Islands - no registrar
-
-.ws = Western Samoa
-
-.ye = Yemen - no registrar
-
-.yt = Mayotte - no registrar
-
-.yu = Yugoslavia Withdrawn in favor of .me and .rs
-
-.za = South Africa
-
-.zm = Zambia - no registrar
-
-.zr = Zaire - Obsolete
-now: The Democratic Republic of the Congo (.cd)
-
-.zw = Zimbabwe - no registrar
diff --git a/inputs/dns_servers.txt.bak b/inputs/dns_servers.txt.bak
deleted file mode 100644
index 844e8d5..0000000
--- a/inputs/dns_servers.txt.bak
+++ /dev/null
@@ -1,6 +0,0 @@
-209.244.0.3
-209.244.0.4
-208.67.222.222
-208.67.220.220
-156.154.70.1
-156.154.71.1
diff --git a/inputs/dns_servers.txt.bak2 b/inputs/dns_servers.txt.bak2
deleted file mode 100644
index 0c4b6f6..0000000
--- a/inputs/dns_servers.txt.bak2
+++ /dev/null
@@ -1 +0,0 @@
-192.168.1.1
diff --git a/inputs/example_exp_list.txt b/inputs/example_exp_list.txt
deleted file mode 100644
index 42ab976..0000000
--- a/inputs/example_exp_list.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-86.59.30.36
-38.229.72.14
-38.229.72.16
diff --git a/inputs/major_isp_dns_servers.txt b/inputs/major_isp_dns_servers.txt
deleted file mode 100644
index 36b8098..0000000
--- a/inputs/major_isp_dns_servers.txt
+++ /dev/null
@@ -1,796 +0,0 @@
-######################################
-## ISP DNS SERVERS BY COUNTRY
-######################################
-## USA
-######################################
-##
-## AT&T
-68.94.156.1
-68.94.157.1
-##
-## ACS Alaska
-209.193.4.7
-209.112.160.2
-##
-## AOL
-205.188.146.145
-##
-## Century Link
-207.14.235.234
-67.238.98.162
-74.4.19.187
-##
-## Charter
-24.296.64.53
-##
-## Cincinnati Bell, ZoomTown
-216.68.4.10
-216.68.5.10
-##
-## Cincinnati Bell, Fuze
-216.68.1.100
-216.68.2.100
-##
-## Comcast, General DNS Servers
-## West Coast
-68.87.85.98
-2001:558:1004:6:68:87:85:98
-## East Coast
-68.87.64.146
-2001:558:1002:B:68:87:64:146
-##
-## Comcast, Albuquerque
-68.87.85.98
-68.87.69.146
-2001:558:1004:6:68:87:85:98
-2001:558:100C:D:68:87:69:146
-##
-## Comcast, Atlanta
-68.87.68.162
-68.87.74.162
-2001:558:100A:4:68:87:68:162
-2001:558:1012:6:68:87:74:162
-##
-## Comcast, Augusta
-68.87.68.162
-68.87.74.162
-2001:558:100A:4:68:87:68:162
-2001:558:1012:6:68:87:74:162
-##
-## Comcast, Battle Creek
-68.87.77.130
-68.87.72.130
-2001:558:1016:C:68:87:77:130
-2001:558:100E:4:68:87:72:130
-##
-## Comcast, Charleston
-68.87.68.162
-68.87.74.162
-2001:558:100A:4:68:87:68:162
-2001:558:1012:6:68:87:74:162
-##
-## Comcast, Chattanooga
-68.87.68.162
-68.87.74.162
-2001:558:100A:4:68:87:68:162
-2001:558:1012:6:68:87:74:162
-##
-## Comcast, Chesterfield
-68.87.73.242
-68.87.71.226
-2001:558:1010:8:68:87:73:242
-2001:558:1000:E:68:87:71:226
-##
-## Comcast, Chicago
-68.87.72.130
-68.87.77.130
-2001:558:100E:4:68:87:72:130
-2001:558:1016:C:68:87:77:130
-##
-## Comcast, Colorado
-68.87.85.98
-68.87.69.146
-2001:558:1004:6:68:87:85:98
-2001:558:100C:D:68:87:69:146
-##
-## Comcast, Connecticut
-68.87.71.226
-68.87.73.242
-2001:558:1000:E:68:87:71:226
-2001:558:1010:8:68:87:73:242
-##
-## Comcast, Dallas
-68.87.68.162
-68.87.74.162
-2001:558:100A:4:68:87:68:162
-2001:558:1012:6:68:87:74:162
-##
-## Comcast, East Tennessee
-68.87.68.162
-68.87.74.162
-2001:558:100A:4:68:87:68:162
-2001:558:1012:6:68:87:74:162
-##
-## Comcast, Elyria
-68.87.75.194
-68.87.64.146
-2001:558:1001:C:68:87:75:194
-2001:558:1002:B:68:87:64:146
-##
-## Comcast, Fort Wayne
-68.87.72.130
-68.87.77.130
-2001:558:100E:4:68:87:72:130
-2001:558:1016:C:68:87:77:130
-##
-## Comcast, Fresno
-68.87.76.178
-68.87.78.130
-2001:558:1014:F:68:87:76:178
-2001:558:1018:6:68:87:78:130
-##
-## Comcast, Hattiesburg-Laurel
-68.87.68.162
-68.87.74.162
-2001:558:100A:4:68:87:68:162
-2001:558:1012:6:68:87:74:162
-##
-## Comcast, Huntsville
-68.87.68.162
-68.87.74.162
-2001:558:100A:4:68:87:68:162
-2001:558:1012:6:68:87:74:162
-##
-## Comcast, Illinois
-68.87.72.130
-68.87.77.130
-2001:558:100E:4:68:87:72:130
-2001:558:1016:C:68:87:77:130
-##
-## Comcast, Independence
-68.87.72.130
-68.87.77.130
-2001:558:100E:4:68:87:72:130
-2001:558:1016:C:68:87:77:130
-##
-## Comcast, Indianapolis
-68.87.72.130
-68.87.77.130
-2001:558:100E:4:68:87:72:130
-2001:558:1016:C:68:87:77:130
-##
-## Comcast, Jacksonville
-68.87.74.162
-68.87.68.162
-2001:558:1012:6:68:87:74:162
-2001:558:100A:4:68:87:68:162
-##
-## Comcast, Knoxville
-68.87.68.162
-68.87.74.162
-2001:558:100A:4:68:87:68:162
-2001:558:1012:6:68:87:74:162
-##
-## Comcast, Lake County
-68.87.74.162
-68.87.68.162
-2001:558:1012:6:68:87:74:162
-2001:558:100A:4:68:87:68:162
-##
-## Comcast, Little Rock
-68.87.68.162
-68.87.74.162
-2001:558:100A:4:68:87:68:162
-2001:558:1012:6:68:87:74:162
-##
-## Comcast, Los Angeles
-68.87.76.178
-68.87.78.130
-2001:558:1014:F:68:87:76:178
-2001:558:1018:6:68:87:78:130
-##
-## Comcast, Massachusetts
-68.87.71.226
-68.87.73.242
-2001:558:1000:E:68:87:71:226
-2001:558:1010:8:68:87:73:242
-##
-## Comcast, Meridian
-68.87.68.162
-68.87.74.162
-2001:558:100A:4:68:87:68:162
-2001:558:1012:6:68:87:74:162
-## Comcast, Miami
-68.87.74.162
-68.87.68.162
-2001:558:1012:6:68:87:74:162
-2001:558:100A:4:68:87:68:162
-##
-## Comcast, Michigan
-68.87.77.130
-68.87.72.130
-2001:558:1016:C:68:87:77:130
-2001:558:100E:4:68:87:72:130
-## Comcast, Minnesota
-68.87.77.130
-68.87.72.130
-2001:558:1016:C:68:87:77:130
-2001:558:100E:4:68:87:72:130
-##
-## Comcast, Mobile
-68.87.68.162
-68.87.74.162
-2001:558:100A:4:68:87:68:162
-2001:558:1012:6:68:87:74:162
-##
-## Comcast, Muncie
-68.87.72.130
-68.87.77.130
-2001:558:100E:4:68:87:72:130
-2001:558:1016:C:68:87:77:130
-##
-## Comcast, Naples
-68.87.74.162
-68.87.68.162
-2001:558:1012:6:68:87:74:162
-2001:558:100A:4:68:87:68:162
-##
-## Comcast, Nashville
-68.87.68.162
-68.87.74.162
-2001:558:100A:4:68:87:68:162
-2001:558:1012:6:68:87:74:162
-##
-## Comcast, New England
-68.87.71.226
-68.87.73.242
-2001:558:1000:E:68:87:71:226
-2001:558:1010:8:68:87:73:242
-##
-## Comcast, Olathe
-68.87.72.130
-68.87.77.130
-2001:558:100E:4:68:87:72:130
-2001:558:1016:C:68:87:77:130
-##
-## Comcast, Oregon
-68.87.69.146
-68.87.85.98
-2001:558:100C:D:68:87:69:146
-2001:558:1004:6:68:87:85:98
-##
-## Comcast, Paducah
-68.87.72.130
-68.87.77.130
-2001:558:100E:4:68:87:72:130
-2001:558:1016:C:68:87:77:130
-##
-## Comcast, Panama City
-68.87.74.162
-68.87.68.162
-2001:558:1012:6:68:87:74:162
-2001:558:100A:4:68:87:68:162
-##
-## Comcast, Pennsylvania
-68.87.75.194
-68.87.64.146
-2001:558:1001:C:68:87:75:194
-2001:558:1002:B:68:87:64:146
-##
-## Comcast, Philadelphia
-68.87.64.146
-68.87.75.194
-2001:558:1002:B:68:87:64:146
-2001:558:1001:C:68:87:75:194
-##
-## Comcast, Pima
-68.87.85.98
-68.87.69.146
-2001:558:1004:6:68:87:85:98
-2001:558:100C:D:68:87:69:146
-##
-## Comcast, Richmond
-68.87.73.242
-68.87.71.226
-2001:558:1010:8:68:87:73:242
-2001:558:1000:E:68:87:71:226
-##
-## Comcast, Sacramento
-68.87.76.178
-68.87.78.130
-2001:558:1014:F:68:87:76:178
-2001:558:1018:6:68:87:78:130
-##
-## Comcast, San Francisco Bay Area
-68.87.76.178
-68.87.78.130
-2001:558:1014:F:68:87:76:178
-2001:558:1018:6:68:87:78:130
-##
-## Comcast, Savannah
-68.87.68.162
-68.87.74.162
-2001:558:100A:4:68:87:68:162
-2001:558:1012:6:68:87:74:162
-##
-## Comcast, South Bend
-68.87.72.130
-68.87.77.130
-2001:558:100E:4:68:87:72:130
-2001:558:1016:C:68:87:77:130
-##
-## Comcast, Spokane
-68.87.69.146
-68.87.85.98
-2001:558:100C:D:68:87:69:146
-2001:558:1004:6:68:87:85:98
-##
-## Comcast, Stockton
-68.87.76.178
-68.87.78.130
-2001:558:1014:F:68:87:76:178
-2001:558:1018:6:68:87:78:130
-##
-## Comcast, Tallahassee
-68.87.74.162
-68.87.68.162
-2001:558:1012:6:68:87:74:162
-2001:558:100A:4:68:87:68:162
-##
-## Comcast, Texas
-68.87.85.98
-68.87.69.146
-2001:558:1004:6:68:87:85:98
-2001:558:100C:D:68:87:69:146
-##
-## Comcast, Tuscaloosa
-68.87.68.162
-68.87.74.162
-2001:558:100A:4:68:87:68:162
-2001:558:1012:6:68:87:74:162
-##
-## Comcast, Utah
-68.87.85.98
-68.87.69.146
-2001:558:1004:6:68:87:85:98
-2001:558:100C:D:68:87:69:146
-##
-## Comcast, Washington
-68.87.69.146
-68.87.85.98
-2001:558:100C:D:68:87:69:146
-2001:558:1004:6:68:87:85:98
-##
-## Comcast, Washington DC
-68.87.73.242
-68.87.71.226
-2001:558:1010:8:68:87:73:242
-2001:558:1000:E:68:87:71:226
-##
-## Comcast, West Florida
-68.87.74.162
-68.87.68.162
-2001:558:1012:6:68:87:74:162
-2001:558:100A:4:68:87:68:162
-##
-## Earthlink
-207.69.188.185
-207.69.188.186
-207.69.188.187
-##
-############################
-## UK
-############################
-##
-## AAISP
-217.169.20.20
-217.169.20.21
-2001:8b0::2020
-2001:8b0::2021
-##
-## AOL Broadband
-64.12.51.132
-149.174.221.8
-205.188.157.232
-205.188.146.145
-##
-## BE Unlimited
-87.194.0.51
-87.194.0.52
-87.194.0.66
-87.194.0.67
-##
-## BT Broadband
-62.6.40.178
-62.6.40.162
-194.72.9.38
-194.72.9.34
-194.72.0.98
-194.72.0.114
-194.74.65.68
-194.74.65.69
-##
-## Bulldog Broadband North
-212.158.248.5
-212.158.248.6
-##
-## Bulldog Broadband South
-83.146.21.5
-83.146.21.6
-##
-## Bytel
-80.76.204.35
-80.76.200.69
-##
-## Clara.net
-195.8.69.7
-195.8.69.12
-##
-## Datanet
-80.68.34.6
-77.241.177.2
-80.68.34.8
-##
-## Demon Internet
-158.152.1.58
-158.152.1.43
-##
-## Eclipse Internet
-212.104.130.9
-212.104.130.65
-##
-## Entanet
-195.74.102.146
-195.74.102.147
-##
-## Exa Networks
-82.219.4.24
-82.219.4.25
-##
-## Fast
-78.143.192.10
-78.143.192.20
-##
-## Freedom 2 Surf
-194.106.56.6
-194.106.33.42
-##
-## IDNet
-212.69.36.3
-212.69.36.2
-212.69.40.2
-##
-## Karoo
-212.50.160.100
-213.249.130.100
-##
-## Madasafish
-80.189.94.2
-80.189.92.2
-##
-## Merula
-217.146.97.10
-217.146.105.2
-##
-## Metronet
-213.162.97.65
-213.162.97.66
-##
-## Namesco
-195.7.224.57
-195.7.224.143
-##
-## NewNet
-212.87.64.10
-212.87.64.11
-##
-## Nildram
-213.208.106.212
-213.208.106.213
-##
-## O2
-87.194.0.51
-87.194.0.52
-87.194.0.66
-87.194.0.67
-##
-## Onetel
-212.67.96.129
-212.67.96.130
-##
-## Onyx
-194.176.65.5
-195.97.231.31
-##
-## Oosha
-213.190.161.254
-213.190.161.250
-213.190.160.9
-##
-## Orange
-195.92.195.94
-195.92.195.95
-##
-## Pipex
-62.241.160.200
-158.43.240.4
-212.74.112.66
-212.74.112.67
-##
-## PlusNet
-212.159.13.49
-212.159.13.50
-212.159.6.9
-212.159.6.10
-##
-## Powernet
-195.60.0.1
-195.60.0.5
-##
-## Prodigy
-198.83.19.241
-198.83.19.244
-207.115.59.241
-207.115.59.244
-##
-## SAQ
-195.2.130.209
-195.2.156.67
-##
-## Scotnet
-217.16.223.30
-217.16.223.31
-##
-## Sky Broadband
-87.86.189.16
-87.86.189.17
-195.40.1.36
-##
-## Skymarket
-212.84.173.66
-212.84.173.82
-##
-## Supanet
-213.40.66.126
-213.40.130.126
-##
-## TalkTalk
-62.24.199.13
-62.24.199.23
-62.24.128.18
-62.24.128.17
-##
-## Tesco
-194.168.4.100
-194.168.8.100
-##
-## Timewarp
-217.149.108.10
-217.149.108.11
-##
-## Timico
-195.54.225.10
-195.54.226.10
-##
-## Tiscali
-212.74.112.66
-212.74.112.67
-80.255.252.50
-80.255.252.58
-##
-## Topletter
-77.95.114.100
-77.95.112.1
-##
-## UK Online
-212.135.1.36
-195.40.1.36
-##
-## Utility Warehouse
-62.24.128.17
-62.24.128.18
-##
-## UTV Internet
-194.46.192.141
-194.46.192.142
-##
-## Virgin Media
-194.168.4.100
-194.168.8.100
-##
-## VISPA
-62.24.228.9
-62.24.228.10
-##
-## Zen Internet
-212.23.3.100
-212.23.6.100
-##
-####################################
-## NEW ZEALAND
-####################################
-##
-## Xtra
-202.27.158.40
-202.27.156.72
-##
-####################################
-## AUSTRALIA
-####################################
-##
-## AANet, Victoria
-203.24.100.125
-203.123.94.40
-##
-## AANet, South Australia
-203.24.100.125
-203.123.69.15
-##
-## AANet, Western Australia
-203.24.100.125
-202.76.136.40
-##
-## AANet, Queensland
-203.24.100.125
-202.76.170.40
-##
-## AANet, New South Wales
-203.24.100.125
-203.123.69.15
-##
-## AAPT, New South Wales
-192.189.54.33
-203.8.183.1
-##
-## AAPT, Victoria
-192.189.54.17
-203.8.183.1
-##
-## AAPT, Queensland
-192.189.54.33
-203.8.183.1
-##
-## AAPT, Tasmania
-192.189.54.17
-203.8.183.1
-##
-## AAPT, Australian Capital Territory
-192.189.54.33
-203.8.183.1
-##
-## AAPT, South Australia
-192.189.54.17
-203.8.183.1
-##
-## AAPT, Northern Territory
-192.189.54.17
-203.8.183.1
-##
-## AAPT, Western Australia
-192.189.54.17
-203.8.183.1
-##
-## Adam
-122.49.191.252
-122.49.191.253
-##
-## Amnet
-203.161.127.1
-203.153.224.42
-##
-## Comcen
-203.23.236.66
-203.23.236.69
-##
-## Dodo
-203.220.32.121
-203.220.32.122
-203.220.32.123
-##
-## Exetel
-220.233.0.4
-220.233.0.3
-##
-## iiNet
-203.0.178.191
-203.0.178.191
-##
-## Internode
-192.231.203.132
-192.231.203.3
-2001:44b8:1::1
-2001:44b8:2::2
-##
-## iPrimus, New South Wales
-203.134.64.66
-203.134.65.66
-##
-## iPrimus, Victoria
-203.134.24.70
-203.134.26.70
-##
-## iPrimus, Queensland
-203.134.12.90
-203.134.102.90
-##
-## iPrimus, Western Australia
-203.134.17.90
-211.26.25.90
-##
-## Netspace
-210.15.254.240
-210.15.254.241
-##
-## Optus
-211.29.132.12
-198.142.0.51
-##
-## People Telecom, New South Wales
-202.154.123.97
-218.214.227.3
-##
-## People Telecom, Northern Territory
-202.154.92.5
-218.214.228.97
-##
-## People Telecom, Queensland
-218.214.227.3
-202.154.123.97
-##
-## People Telecom, South Australia
-218.214.228.97
-218.214.17.1
-##
-## People Telecom, Victoria
-218.214.17.1
-218.214.228.97
-##
-## People Telecom, Western Australia
-202.154.92.5
-218.214.228.97
-##
-## Spin Internet
-203.23.236.66
-203.23.236.69
-##
-## Telstra BigPond, New South Wales
-61.9.194.49
-61.9.195.193
-##
-## Telstra BigPond, Victoria
-61.9.133.193
-61.9.134.49
-##
-## Telstra BigPond, Queensland
-61.9.211.33
-61.9.211.1
-##
-## Telstra BigPond, Tasmania
-61.9.188.33
-61.9.134.49
-##
-## Telstra BigPond, Australian Capital Territory
-61.9.207.1
-61.9.195.193
-##
-## Telstra BigPond, South Australia
-61.9.226.33
-61.9.194.49
-##
-## Telstra BigPond, Northern Territory
-61.9.226.33
-61.9.194.49
-##
-## Telstra BigPond, Western Australia
-61.9.242.33
-61.9.226.33
-##
-## TPG
-203.12.160.35
-203.12.160.36
-203.12.160.37
-##
-## Westnet
-203.21.20.20
-203.10.1.9
-########################################
diff --git a/inputs/short_hostname_list.txt b/inputs/short_hostname_list.txt
deleted file mode 100644
index f13c702..0000000
--- a/inputs/short_hostname_list.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-torproject.org
-google.com
-ooni.nu
-torrentz.eu
-anarchyplanet.org
-riseup.net
-indymedia.org
diff --git a/inputs/tld-list-cc.txt b/inputs/tld-list-cc.txt
deleted file mode 100644
index 57e0cc8..0000000
--- a/inputs/tld-list-cc.txt
+++ /dev/null
@@ -1,511 +0,0 @@
-.ac = Ascension Island
-
-.ad = Andorra
-
-.ae = United Arab Emirates
-
-.af = Afghanistan
-
-.ag = Antigua and Barbuda
-
-.ai = Anguilla
-
-.al = Albania
-
-.am = Armenia
-
-.an = Netherlands Antilles
-
-.ao = Angola
-
-.aq = Antarctica - no registrar
-
-.ar = Argentina
-
-.as = American Samoa
-
-.at = Austria
-
-.au = Australia
-
-.aw = Aruba - no registrar
-
-.ax = Aland Islands
-
-.az = Azerbaijan - no registrar
-
-.ba = Bosnia and Herzegovina
-
-.bb = Barbados
-
-.bd = Bangladesh - no registrar
-
-.be = Belgium
-
-.bf = Burkina Faso - no registrar
-
-.bg = Bulgaria
-
-.bh = Bahrain
-
-.bi = Burundi
-
-.bj = Benin ... (little info) DETAILS
-
-.bm = Bermuda
-
-.bn = Brunei Darussalam
-
-.bo = Bolivia
-
-.br = Brazil
-
-.bs = Bahamas
-
-.bt = Bhutan
-
-.bv = Bouvet Island - not in use
-
-.bw = Botswana - no registrar
-
-.by = Belarus
-
-.bz = Belize
-
-.ca = Canada
-
-.cc = Cocos (Keeling) Islands
-
-.cd = The Democratic Republic of the Congo
-
-.cf = Central African Republic - no registrar
-
-.cg = Republic of Congo
-
-.ch = Switzerland
-
-.ci = Cote d'Ivoire
-
-.ck = Cook Islands
-
-.cl = Chile
-
-.cm = Cameroon - no registrar - wildcarded
-
-.cn = China
-
-.co = Colombia
-
-.cr = Costa Rica
-
-.cs = (former) Serbia and Montenegro - no registrar - see: .me
-(.cs was also formerly the ISO_3166-1 code for Czechoslovakia, now .cs is closed.)
-
-.cu = Cuba - no registrar
-
-.cv = Cape Verde - no registrar
-
-.cx = Christmas Island
-
-.cy = Cyprus
-
-.cz = Czech Republic
-
-.dd = East Germany (obsolete)
-
-.de = Germany
-
-.dj = Djibouti - no information
-
-.dk = Denmark
-
-.dm = Dominica
-
-.do = Dominican Republic
-
-.dz = Algeria - no registrar
-
-.ec = Ecuador
-
-.ee = Estonia
-
-.eg = Egypt - DETAILS
-
-.eh = Western Sahara - no registrar
-
-.er = Eritrea - no registrar
-
-.es = Spain
-
-.et = Ethiopia
-
-.eu = European Union - DETAILS
-
-.fi = Finland
-
-.fj = Fiji
-
-.fk = Falkland Islands (Malvinas)
-
-.fm = Micronesia, Federal State of
-
-.fo = Faroe Islands
-
-.fr = France
-
-.ga = Gabon - no registrar
-
-.gb = Great Britain (United Kingdom) - reserved, see .uk
-
-.gd = Grenada
-
-.ge = Georgia
-
-.gf = French Guiana
-
-.gg = Guernsey
-
-.gh = Ghana
-
-.gi = Gibraltar
-
-.gl = Greenland
-
-.gm = Gambia
-
-.gn = Guinea
-
-.gp = Guadeloupe - no information
-
-.gq = Equatorial Guinea - no information
-
-.gr = Greece
-
-.gs = South Georgia and the
-South Sandwich Islands
-
-.gt = Guatemala
-
-.gu = Guam
-
-.gw = Guinea-Bissau - no registrar
-
-.gy = Guyana - no registrar
-
-.hk = Hong Kong
-
-.hm = Heard and McDonald Islands
-
-.hn = Honduras
-
-.hr = Croatia/Hrvatska
-
-.ht = Haiti - no registrar
-
-.hu = Hungary
-
-.id = Indonesia - no information
-
-.ie = Ireland
-
-.il = Israel
-
-.im = Isle of Man
-
-.in = India
-
-.io = British Indian Ocean Territory
-
-.iq = Iraq - no registrar
-
-.ir = Islamic Republic of Iran
-
-.is = Iceland
-
-.it = Italy
-
-.je = Jersey
-
-.jm = Jamaica - no registrar
-
-.jo = Jordan
-
-.jp = Japan
-
-.ke = Kenya
-
-.kg = Kyrgyzstan - no registrar
-
-.kh = Cambodia
-
-.ki = Kiribati
-
-.km = Comoros
-
-.kn = Saint Kitts and Nevis - no registrar
-
-.kp = Democratic People's Republic of Korea
-(North) - no registrar
-
-.kr = Republic of Korea (South)
-
-.kw = Kuwait - no registrar
-
-.ky = Cayman Islands
-
-.kz = Kazakhstan
-
-.la = Lao People's Democratic Republic (Laos)
-... DETAILS
-
-.lb = Lebanon
-
-.lc = Saint Lucia
-
-.li = Liechtenstein
-
-.lk = Sri Lanka
-
-.lr = Liberia
-
-.ls = Lesotho - no registrar
-
-.lt = Lithuania
-
-.lu = Luxembourg
-
-.lv = Latvia
-
-.ly = Libyan Arab Jamahiriya (Libya)
-
-.ma = Morocco
-
-.mc = Monaco
-
-.md = Moldova
-
-.me = Montenegro
-
-.mg = Madagascar
-
-.mh = Marshall Islands
-
-.mk = Macedonia
-
-.ml = Mali - no information
-
-.mm = Myanmar (formerly Burma) - no registrar
-
-.mn = Mongolia
-
-.mo = Macau
-
-.mp = Northern Mariana Islands
-
-.mq = Martinique - no information
-
-.mr = Mauritania
-
-.ms = Montserrat
-
-.mt = Malta
-
-.mu = Mauritius
-
-.mv = Maldives - no registrar
-
-.mw = Malawi
-
-.mx = Mexico
-
-.my = Malaysia
-
-.mz = Mozambique - no registrar
-
-.na = Namibia
-
-.nc = New Caledonia
-
-.ne = Niger - no information
-
-.nf = Norfolk Island
-
-.ng = Nigeria
-
-.ni = Nicaragua
-
-.nl = Netherlands
-
-.no = Norway
-
-.np = Nepal
-
-.nr = Nauru
-
-.nu = Niue
-
-.nz = New Zealand
-
-.om = Oman - Omantel.net.om not functioning
-
-.pa = Panama
-
-.pe = Peru
-
-.pf = French Polynesia - no registrar
-
-.pg = Papua New Guinea - no registrar
-
-.ph = Philippines
-
-.pk = Pakistan
-
-.pl = Poland
-
-.pm = Saint Pierre and Miquelon - not available
-
-.pn = Pitcairn Island
-
-.pr = Puerto Rico
-
-.ps = Palestinian Territories
-
-.pt = Portugal
-
-.pw = Palau
-
-.py = Paraguay
-
-.qa = Qatar
-
-.re = Reunion Island
-
-.ro = Romania
-
-.rs = Serbia - no registrar
-
-.ru = Russian Federation
-
-.rw = Rwanda
-
-.sa = Saudi Arabia
-
-.sb = Solomon Islands
-
-.sc = Seychelles
-
-.sd = Sudan
-
-.se = Sweden
-
-.sg = Singapore
-
-.sh = Saint Helena
-
-.si = Slovenia
-
-.sj = Svalbard and Jan Mayen Islands - not in use
-
-.sk = Slovak Republic
-
-.sl = Sierra Leone
-
-.sm = San Marino
-
-.sn = Senegal - no registrar
-
-.so = Somalia - no registrar
-
-.sr = Suriname
-
-.st = Sao Tome and Principe
-
-.su = Soviet Union
-
-.sv = El Salvador
-
-.sy = Syrian Arab Republic
-
-.sz = Swaziland
-
-.tc = Turks and Caicos Islands - no registrar
-
-.td = Chad - no registrar
-
-.tf = French Southern Territories - no registrar
-
-.tg = Togo
-
-.th = Thailand
-
-.tj = Tajikistan
-
-.tk = Tokelau
-
-.tl = Timor-Leste
-
-.tm = Turkmenistan
-
-.tn = Tunisia
-
-.to = Tonga
-
-.tp = East Timor - Closed. See: Timor-Leste
-
-.tr = Turkey
-
-.tt = Trinidad and Tobago
-
-.tv = Tuvalu
-
-.tw = Taiwan
-
-.tz = Tanzania
-
-.ua = Ukraine
-
-.ug = Uganda
-
-.uk = United Kingdom
-
-.um = United States Minor Outlying Islands
-- Withdrawn, no domains exist.
-
-.us = United States (USA)
-
-.uy = Uruguay
-
-.uz = Uzbekistan
-
-.va = Holy See (Vatican City State)- no registrar
-
-.vc = Saint Vincent and the Grenadines
-
-.ve = Venezuela
-
-.vg = British Virgin Islands
-
-.vi = U.S. Virgin Islands
-
-.vn = Vietnam
-
-.vu = Vanuatu
-
-.wf = Wallis and Futuna Islands - no registrar
-
-.ws = Western Samoa
-
-.ye = Yemen - no registrar
-
-.yt = Mayotte - no registrar
-
-.yu = Yugoslavia Withdrawn in favor of .me and .rs
-
-.za = South Africa
-
-.zm = Zambia - no registrar
-
-.zr = Zaire - Obsolete
-now: The Democratic Republic of the Congo (.cd)
-
-.zw = Zimbabwe - no registrar
diff --git a/inputs/tld-list-mozilla.txt b/inputs/tld-list-mozilla.txt
deleted file mode 100644
index 7902eee..0000000
--- a/inputs/tld-list-mozilla.txt
+++ /dev/null
@@ -1,5 +0,0 @@
---2012-05-19 13:07:53-- https://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_na…
-Resolving mxr.mozilla.org (mxr.mozilla.org) 63.245.215.42
-Connecting to mxr.mozilla.org (mxr.mozilla.org)|63.245.215.42|:443... connected.
-ERROR: The certificate of `mxr.mozilla.org' is not trusted.
-ERROR: The certificate of `mxr.mozilla.org' hasn't got a known issuer.
diff --git a/inputs/top-1m.txt.bak2 b/inputs/top-1m.txt.bak2
deleted file mode 100644
index 293e661..0000000
--- a/inputs/top-1m.txt.bak2
+++ /dev/null
@@ -1,11 +0,0 @@
-1,torproject.org
-2,google.com
-3,facebook.com
-4,youtube.com
-5,yahoo.com
-6,baidu.com
-7,wikipedia.org
-8,live.com
-9,blogspot.com
-10,twitter.com
-11,qq.com
1
0

06 Nov '12
commit 349617c3b21ca5fc8454b7853df6170b8d983584
Author: Translation commit bot <translation(a)torproject.org>
Date: Tue Nov 6 23:15:15 2012 +0000
Update translations for vidalia
---
ja/vidalia_ja.po | 40 ++++++++++++++++++++--------------------
1 files changed, 20 insertions(+), 20 deletions(-)
diff --git a/ja/vidalia_ja.po b/ja/vidalia_ja.po
index e536590..470467c 100644
--- a/ja/vidalia_ja.po
+++ b/ja/vidalia_ja.po
@@ -14,7 +14,7 @@ msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: https://trac.torproject.org/projects/tor\n"
"POT-Creation-Date: 2012-03-21 17:52+0000\n"
-"PO-Revision-Date: 2012-11-06 22:42+0000\n"
+"PO-Revision-Date: 2012-11-06 23:12+0000\n"
"Last-Translator: 9g0Z3it0gjbxzope <doutrafr(a)fakeinbox.com>\n"
"Language-Team: translations(a)vidalia-project.net\n"
"MIME-Version: 1.0\n"
@@ -203,14 +203,14 @@ msgstr "Torのソケットパスとして使うファイルを選んでくださ
msgctxt "AdvancedPage"
msgid "Configure ControlPort automatically"
-msgstr ""
+msgstr "コントロールポートを自動設定する"
msgctxt "AdvancedPage"
msgid ""
"You've checked the autoconfiguration option for the ControlPort, but "
"provided no Data Directory. Please add one, or uncheck the \"Configure "
"ControlPort automatically\" option."
-msgstr ""
+msgstr "コントロールポートの自動設定オプションをチェックしていますが、データディレクトリが設定されていません。データディレクトリを設定するか、\"Configure ControlPort automatically\"オプションのチェックを外してください。"
msgctxt "AdvancedPage"
msgid ""
@@ -242,11 +242,11 @@ msgstr "Vidaliaは選択された言語データをロードできませんで
msgctxt "AppearancePage"
msgid ""
"System Icon Preferences (changes will take effect when you restart Vidalia)"
-msgstr ""
+msgstr "システムアイコンの設定 (変更はVidaliaの再起動後に反映されます)"
msgctxt "AppearancePage"
msgid "Show the Tray Icon and Dock Icon (default)"
-msgstr ""
+msgstr "トレイアイコンとドックアイコンを表示する (デフォルト)"
msgctxt "AppearancePage"
msgid "Hide the Tray Icon"
@@ -1324,14 +1324,14 @@ msgctxt "CrashReportDialog"
msgid ""
"<a "
"href=\"https://trac.torproject.org/projects/tor/newticket\">https://trac.torproject.org/projects/tor/newticket</a>"
-msgstr ""
+msgstr "<a href=\"https://trac.torproject.org/projects/tor/newticket\">https://trac.torproject.org/projects/tor/newticket</a>"
msgctxt "CrashReportDialog"
msgid ""
"A crash report has been created that you can send to the Vidalia developers "
"to help identify and fix the problem. The submitted report does not contain "
"any personally identifying information."
-msgstr ""
+msgstr "あなたがVidaliaの開発者に問題を特定し修正するのを助けるため送ることのできるクラッシュレポートが作られました。投稿されたレポートには個人を特定する情報は含まれません。"
msgctxt "CrashReportDialog"
msgid ""
@@ -2097,17 +2097,17 @@ msgstr ""
msgctxt "MainWindow"
msgid "(probably Telnet)"
-msgstr ""
+msgstr "(おそらくTelnet)"
msgctxt "MainWindow"
msgid "(probably an email client)"
-msgstr ""
+msgstr "(おそらく電子メールクライアント)"
msgctxt "MainWindow"
msgid ""
"One of your applications %1 appears to be making a potentially unencrypted "
"and unsafe connection to port %2."
-msgstr ""
+msgstr "アプリケーション%1がポート%2に暗号化されていない安全ではない可能性のある接続を作っています"
msgctxt "MainWindow"
msgid "failed (%1)"
@@ -2132,7 +2132,7 @@ msgid ""
"It seems Tor has stopped running since Vidalia started it.\n"
"\n"
"See the Advanced Message Log for more information."
-msgstr ""
+msgstr "Vidaliaによる起動後Torが停止したようです。\n\n詳細な情報はメッセージログの詳細を見てください。"
msgctxt "MainWindow"
msgid ""
@@ -2697,7 +2697,7 @@ msgstr "HTTP / HTTPS"
msgctxt "NetworkPage"
msgid "You must specify one or more bridges."
-msgstr ""
+msgstr "一つ以上のブリッジを記述する必要があります。"
msgctxt "Policy"
msgid "accept"
@@ -3121,11 +3121,11 @@ msgstr "ブリッジのアドレスを自動的に配信する"
msgctxt "ServerPage"
msgid "Relay traffic for the Tor network (exit relay)"
-msgstr ""
+msgstr "Torネットワークのトラフィックを中継する (exitリレー)"
msgctxt "ServerPage"
msgid "Relay traffic inside the Tor network (non-exit relay)"
-msgstr ""
+msgstr "Torネットワーク内のトラフィックを中継する (non-exitリレー)"
msgctxt "ServerPage"
msgid "Mirror the Relay Directory"
@@ -3462,7 +3462,7 @@ msgid ""
"see an increase in network traffic shown by the Bandwidth Graph within a few"
" hours as more clients learn about your relay. Thank you for contributing to"
" the Tor network!"
-msgstr ""
+msgstr "あなたのリレーはオンラインでTorクライアントから利用可能です。数時間以内にクライアントがあなたのリレーを知るにつれ、帯域幅グラフで表示されるネットワークトラフィックが増加するはずです。Torネットワークへの貢献に感謝します!"
msgctxt "Stream"
msgid "New"
@@ -3524,7 +3524,7 @@ msgctxt "TorrcDialog"
msgid ""
"Save settings. If unchecked it will only apply settings to the current Tor "
"instance."
-msgstr ""
+msgstr "設定を保存する。チェックしない場合、設定は現在実行中のTorにのみ適用されます。"
msgctxt "TorrcDialog"
msgid "Cut"
@@ -3544,7 +3544,7 @@ msgstr "戻す"
msgctxt "TorrcDialog"
msgid "Redo"
-msgstr ""
+msgstr "やり直す"
msgctxt "TorrcDialog"
msgid "Select All"
@@ -3564,11 +3564,11 @@ msgstr "Torへの接続エラー"
msgctxt "TorrcDialog"
msgid "Selection is empty. Please select some text, or check \"Apply all\""
-msgstr ""
+msgstr "何も選択されていません。テキストを選択するか、\"すべて適用\"をチェックしてください。"
msgctxt "TorrcDialog"
msgid "Error at line %1: \"%2\""
-msgstr ""
+msgstr "%1行目でエラー: \"%2\""
msgctxt "TorrcDialog"
msgid "Error"
@@ -3576,7 +3576,7 @@ msgstr "エラー"
msgctxt "TorrcDialog"
msgid "An error ocurred while opening torrc file"
-msgstr ""
+msgstr "torrcファイルを開くときにエラーが発生しました"
msgctxt "UPNPControl"
msgid "Success"
1
0

[tor/master] Fix a stupid logic-error in warnings about low ports.
by nickm@torproject.org 06 Nov '12
by nickm@torproject.org 06 Nov '12
06 Nov '12
commit 11c467f6431773abaa4cced036b3bf87d4ea7f22
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Tue Nov 6 17:15:39 2012 -0500
Fix a stupid logic-error in warnings about low ports.
Instead of warning about low ports that are advertised, we should have
been warning about low ports that we're listening on. Bug 7285, fix
on 0.2.3.9-alpha.
---
changes/bug7285 | 4 ++++
src/or/config.c | 2 +-
2 files changed, 5 insertions(+), 1 deletions(-)
diff --git a/changes/bug7285 b/changes/bug7285
new file mode 100644
index 0000000..3c00205
--- /dev/null
+++ b/changes/bug7285
@@ -0,0 +1,4 @@
+ o Minor bugfixes:
+ - Warn when we are binding low ports when hibernation is enabled;
+ previously we had warned when we were _advertising_ low ports with
+ hibernation enabled. Fixes bug 7285; bugfix on 0.2.3.9-alpha.
diff --git a/src/or/config.c b/src/or/config.c
index dca49f5..bf32fae 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -5004,7 +5004,7 @@ check_server_ports(const smartlist_t *ports,
continue;
}
#ifndef _WIN32
- if (!port->no_advertise && port->port < 1024)
+ if (!port->no_listen && port->port < 1024)
++n_low_port;
#endif
} SMARTLIST_FOREACH_END(port);
1
0
commit cd054ceadaa4723f076c7050160424b356b985ca
Merge: b0688bb 11c467f
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Tue Nov 6 18:02:03 2012 -0500
Merge branch 'bug7285'
changes/bug7285 | 4 ++++
src/or/config.c | 2 +-
2 files changed, 5 insertions(+), 1 deletions(-)
1
0

[torspec/master] Be able to specify the bind address of managed proxies.
by nickm@torproject.org 06 Nov '12
by nickm@torproject.org 06 Nov '12
06 Nov '12
commit 34d5711829cac4611c0ce43157843b572d63fe86
Author: George Kadianakis <desnacked(a)riseup.net>
Date: Tue Oct 30 03:30:39 2012 +0200
Be able to specify the bind address of managed proxies.
---
pt-spec.txt | 14 ++++++++++++++
1 files changed, 14 insertions(+), 0 deletions(-)
diff --git a/pt-spec.txt b/pt-spec.txt
index ffabb4d..0da004a 100644
--- a/pt-spec.txt
+++ b/pt-spec.txt
@@ -134,6 +134,20 @@ Server behavior
then Tor will launch the megaproxy binary twice: once with the option
--foo and once with the option --bar.
+ The address that a managed proxy will use to bind can be configured with:
+ ServerTransportListenAddr <method> <address:port>
+
+ For example, a valid configuration would be:
+ ServerTransportPlugin obfs2,obfs3,stegotorus exec /usr/bin/obfsproxy --managed
+ ServerTransportListenAddr obfs2 0.0.0.0:4200
+ ServerTransportListenAddr stegotorus 98.23.4.45:6559
+
+ If no ServerTransportListenAddr is specified and it's the first time
+ that Tor encounters that transport, Tor will instruct the managed
+ proxy to bind to a random TCP port on 0.0.0.0. If Tor has seen the
+ trasport before, it will instruct the managed proxy to bind to the
+ same TCP port that the transport used last time.
+
Managed proxy interface
When the Tor client or relay launches a managed proxy, it communicates
1
0

[tor/master] Add warning message when a managed proxy dies during configuration.
by nickm@torproject.org 06 Nov '12
by nickm@torproject.org 06 Nov '12
06 Nov '12
commit a9f786758dc59ee28fbbd16228e38ff9ba1bc7a9
Author: George Kadianakis <desnacked(a)riseup.net>
Date: Tue Oct 23 02:51:31 2012 +0300
Add warning message when a managed proxy dies during configuration.
---
changes/bug7195 | 4 ++++
src/common/util.c | 19 +++++++++++++++++++
src/common/util.h | 2 ++
src/or/transports.c | 9 ++++++++-
4 files changed, 33 insertions(+), 1 deletions(-)
diff --git a/changes/bug7195 b/changes/bug7195
new file mode 100644
index 0000000..86ddeca
--- /dev/null
+++ b/changes/bug7195
@@ -0,0 +1,4 @@
+ o Minor bugfixes:
+ - Add warning message when a managed proxy dies during
+ configuration. Fixes bug 7195; bugfix on 0.2.4.2-alpha.
+
diff --git a/src/common/util.c b/src/common/util.c
index 75eb233..1b0603a 100644
--- a/src/common/util.c
+++ b/src/common/util.c
@@ -4461,6 +4461,25 @@ tor_split_lines(smartlist_t *sl, char *buf, int len)
return smartlist_len(sl);
}
+/** Return a string corresponding to <b>stream_status</b>. */
+const char *
+stream_status_to_string(enum stream_status stream_status)
+{
+ switch (stream_status) {
+ case IO_STREAM_OKAY:
+ return "okay";
+ case IO_STREAM_EAGAIN:
+ return "temporarily unavailable";
+ case IO_STREAM_TERM:
+ return "terminated";
+ case IO_STREAM_CLOSED:
+ return "closed";
+ default:
+ tor_fragile_assert();
+ return "unknown";
+ }
+}
+
#ifdef _WIN32
/** Return a smartlist containing lines outputted from
diff --git a/src/common/util.h b/src/common/util.h
index aa2087b..fabfdb1 100644
--- a/src/common/util.h
+++ b/src/common/util.h
@@ -307,6 +307,8 @@ enum stream_status {
IO_STREAM_CLOSED
};
+const char *stream_status_to_string(enum stream_status stream_status);
+
enum stream_status get_string_from_pipe(FILE *stream, char *buf, size_t count);
/** Return values from file_status(); see that function's documentation
diff --git a/src/or/transports.c b/src/or/transports.c
index a532f87..0319071 100644
--- a/src/or/transports.c
+++ b/src/or/transports.c
@@ -614,8 +614,15 @@ configure_proxy(managed_proxy_t *mp)
tor_get_lines_from_handle(tor_process_get_stdout_pipe(mp->process_handle),
&stream_status);
if (!proxy_output) { /* failed to get input from proxy */
- if (stream_status != IO_STREAM_EAGAIN)
+ if (stream_status != IO_STREAM_EAGAIN) { /* bad stream status! */
mp->conf_state = PT_PROTO_BROKEN;
+ log_warn(LD_GENERAL, "The communication stream of managed proxy '%s' "
+ "is '%s'. Most probably the managed proxy stopped running. "
+ "This might be a bug of the managed proxy, a bug of Tor, or "
+ "a misconfiguration. Please enable logging on your managed "
+ "proxy and check the logs for errors.",
+ mp->argv[0], stream_status_to_string(stream_status));
+ }
goto done;
}
1
0
commit b0688bbf49345cc294d2f4095c3ad11171a61f0e
Merge: 39a0a2c a9f7867
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Tue Nov 6 17:53:45 2012 -0500
Merge branch 'bug7195'
changes/bug7195 | 4 ++++
src/common/util.c | 19 +++++++++++++++++++
src/common/util.h | 2 ++
src/or/transports.c | 9 ++++++++-
4 files changed, 33 insertions(+), 1 deletions(-)
1
0

06 Nov '12
commit 6d0b057752a1cc3cbee67e3ebbb5fbb44fbed67b
Author: Translation commit bot <translation(a)torproject.org>
Date: Tue Nov 6 22:45:15 2012 +0000
Update translations for vidalia
---
ja/vidalia_ja.po | 20 ++++++++++----------
1 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/ja/vidalia_ja.po b/ja/vidalia_ja.po
index 338490b..e536590 100644
--- a/ja/vidalia_ja.po
+++ b/ja/vidalia_ja.po
@@ -14,7 +14,7 @@ msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: https://trac.torproject.org/projects/tor\n"
"POT-Creation-Date: 2012-03-21 17:52+0000\n"
-"PO-Revision-Date: 2012-11-06 20:21+0000\n"
+"PO-Revision-Date: 2012-11-06 22:42+0000\n"
"Last-Translator: 9g0Z3it0gjbxzope <doutrafr(a)fakeinbox.com>\n"
"Language-Team: translations(a)vidalia-project.net\n"
"MIME-Version: 1.0\n"
@@ -3371,25 +3371,25 @@ msgid ""
"Tor detected that your DNS provider is providing false responses for domains"
" that do not exist. Some ISPs and other DNS providers, such as OpenDNS, are "
"known to do this in order to display their own search or advertising pages."
-msgstr ""
+msgstr "TorはあなたのDNSプロバイダが存在しないドメインに対し偽の応答を返したことを検出しました。OpenDNSのような、いくつかのISPやDNSプロバイダは、自身の検索や広告ページを表示するためこのようなことを行うことが知られています。"
msgctxt "StatusEventWidget"
msgid ""
"Tor detected that your DNS provider is providing false responses for well "
"known domains. Since clients rely on Tor network relays to provide accurate "
"DNS repsonses, your relay will not be configured as an exit relay."
-msgstr ""
+msgstr "TorはあなたのDNSプロバイダが既知のドメインに対し偽の応答を返したことを検出しました。Torネットワーク上のリレーが正しいDNSの応答を返すようにするため、あなたのリレーはexitリレーとして構成されません。"
msgctxt "StatusEventWidget"
msgid "Checking Server Port Reachability"
-msgstr ""
+msgstr "サーバーポートの到達性を確認中"
msgctxt "StatusEventWidget"
msgid ""
"Tor is trying to determine if your relay's server port is reachable from the"
" Tor network by connecting to itself at %1:%2. This test could take several "
"minutes."
-msgstr ""
+msgstr "Torは%1:%2に接続することであなたのリレーのサーバーポートがTorネットワークから到達可能か確認しています。このテストは数分かかるかもしれません。"
msgctxt "StatusEventWidget"
msgid "Server Port Reachability Test Successful!"
@@ -3409,7 +3409,7 @@ msgid ""
"happen if you are behind a router or firewall that requires you to set up "
"port forwarding. If %1:%2 is not your correct IP address and server port, "
"please check your relay's configuration."
-msgstr ""
+msgstr "あなたのリレーのサーバーポートは他のTorクライアントから到達できません。これはあなたがポートフォワーディングの設定を必要とするルーターやファイアーウォールの内側にいると起こり得ます。%1:%2があなたの正しいIPアドレスとサーバーポートではない場合、リレーの設定を確認してください。"
msgctxt "StatusEventWidget"
msgid "Checking Directory Port Reachability"
@@ -3420,7 +3420,7 @@ msgid ""
"Tor is trying to determine if your relay's directory port is reachable from "
"the Tor network by connecting to itself at %1:%2. This test could take "
"several minutes."
-msgstr ""
+msgstr "Torは%1:%2に接続することであなたのリレーのディレクトリポートがTorネットワークから到達可能か確認しています。このテストは数分かかるかもしれません。"
msgctxt "StatusEventWidget"
msgid "Directory Port Reachability Test Successful!"
@@ -3440,17 +3440,17 @@ msgid ""
"happen if you are behind a router or firewall that requires you to set up "
"port forwarding. If %1:%2 is not your correct IP address and directory port,"
" please check your relay's configuration."
-msgstr ""
+msgstr "あなたのリレーのディレクトリポートは他のTorクライアントから到達できません。これはあなたがポートフォワーディングの設定を必要とするルーターやファイアーウォールの内側にいると起こり得ます。%1:%2があなたの正しいIPアドレスとディレクトリポートではない場合、リレーの設定を確認してください。"
msgctxt "StatusEventWidget"
msgid "Relay Descriptor Rejected"
-msgstr ""
+msgstr "リレー記述子が拒否されました"
msgctxt "StatusEventWidget"
msgid ""
"Your relay's descriptor, which enables clients to connect to your relay, was"
" rejected by the directory server at %1:%2. The reason given was: %3"
-msgstr ""
+msgstr "クライアントがあなたのリレーに接続するための、あなたのリレーの記述子はディレクトリサーバー%1:%2に拒否されました。理由は以下の通りです: %3"
msgctxt "StatusEventWidget"
msgid "Your Relay is Online"
1
0

r25865: {website} Add pluggable transport information to docs/bridges. (in website/trunk: docs/en images)
by George Kadianakis 06 Nov '12
by George Kadianakis 06 Nov '12
06 Nov '12
Author: asn
Date: 2012-11-06 22:40:33 +0000 (Tue, 06 Nov 2012)
New Revision: 25865
Added:
website/trunk/images/vidalia_add_obfsbridge.png
Modified:
website/trunk/docs/en/bridges.wml
Log:
Add pluggable transport information to docs/bridges.
Modified: website/trunk/docs/en/bridges.wml
===================================================================
--- website/trunk/docs/en/bridges.wml 2012-11-06 22:39:45 UTC (rev 25864)
+++ website/trunk/docs/en/bridges.wml 2012-11-06 22:40:33 UTC (rev 25865)
@@ -13,6 +13,15 @@
<a id="BridgeIntroduction"></a>
<h2><a class="anchor" href="#BridgeIntroduction">Tor: Bridges</a></h2>
<hr>
+
+ <p>
+ <img width="7%" height="7%" style="float: left;" src="$(IMGROOT)/icon-Obfsproxy.jpg">
+ <b>Tip:</b>
+ Having trouble connecting to Tor even when using bridges? You will
+ need to use <b>pluggable transports</b> and <b>obfuscated
+ bridges</b>. <a class="anchor" href="#PluggableTransports">Click
+ here for more information</a>.
+ </p>
<p>
Bridge relays (or "bridges" for short) are Tor relays that aren't listed in
@@ -70,10 +79,29 @@
href="#FindingMore">other ways to find bridges</a> too.
</p>
- <a id="Understanding"></a>
- <h2><a class="anchor" href="#Understanding">Understanding bridges</a></h2>
+ <a id="PluggableTransports"></a>
+ <h2><a class="anchor" href="#PluggableTransports">Obfuscated Bridges and Pluggable Transports</a></h2>
<hr>
+ <p> Lately, censors have found ways to block Tor even when clients
+ are using bridges. They usually do this by installing boxes in
+ ISPs that peek at network traffic and detect Tor; when Tor is
+ detected they block the traffic flow.
+ </p>
+
+ <p>To circumvent such sophisicated censorship Tor introduced
+ <i>obfuscated bridges</i>. These bridges use special plugins
+ called <i>pluggable transports</i> which obfuscate the traffic
+ flow of Tor, making its detection harder.
+
+ To connect to obfuscated bridges you need to use the <a
+ href=https://www.torproject.org/projects/obfsproxy.html.en#download>Obfproxy
+ Tor Browser Bundle</a>. The bundle includes some pre-configured
+ obfsproxy bridges and you can get more off <a
+ href=https://bridges.torproject.org/?transport=obfs2>BridgeDB</a>
+
+ <a id="Understanding"></a>
+ <h2><a class="anchor" href="#Understanding">Understanding bridges</a></h2><hr>
<p>
As an example, you'll get a bridge entry that looks like the
following:
@@ -90,8 +118,23 @@
The second element is the port: <tt>'443'</tt><br>
The third element, the fingerprint, is optional:
<tt>'4352e58420e68f5e40bf7c74faddccd9d1349413'</tt><br>
+
+ <p>
+ <img width="7%" height="7%" style="vertical-align:middle" src="$(IMGROOT)/icon-Obfsproxy.jpg">
+ <span><b>Pluggable transports tip:</b></span>
</p>
-
+ <p>
+ If your bridge line looks like this:
+ <pre><samp>
+ bridge obfs2 141.201.27.48:420 4352e58420e68f5e40bf7c74faddccd9d1349413
+ </samp>
+ </pre>
+
+ The second element is the name of the pluggable transport
+ technology used by the bridge. For example, in the case above, the
+ bridge is using the <i>obfs2</i> pluggable transport.
+ </p>
+
<a id="UsingBridges"></a>
<h2><a class="anchor" href="#UsingBridges">Using bridges with Tor and
Vidalia</a></h2>
@@ -115,6 +158,21 @@
to reach the Tor network, but if you only have one bridge and it goes
down, you will be cut off from the Tor network.
</p>
+
+ <p>
+ <img width="7%" height="7%" style="vertical-align:middle" src="$(IMGROOT)/icon-Obfsproxy.jpg">
+ <span><b>Pluggable transports tip:</b></span>
+ </p>
+ <p>
+
+ If you have managed to get hold of some obfuscated bridge
+ addresses, you should add them in Vidalia in the same fashion that
+ you add normal bridges. Just paste the bridge line into the "Add a
+ bridge" window:
+
+ <br><br>
+ <img src="$(IMGROOT)/vidalia_add_obfsbridge.png" alt="Add obfuscated bridge in Vidalia">
+ <br><br>
<a id="FindingMore"></a>
<h2><a class="anchor" href="#FindingMore">Finding more bridges for Tor</a></h2>
Added: website/trunk/images/vidalia_add_obfsbridge.png
===================================================================
--- website/trunk/images/vidalia_add_obfsbridge.png (rev 0)
+++ website/trunk/images/vidalia_add_obfsbridge.png 2012-11-06 22:40:33 UTC (rev 25865)
@@ -0,0 +1,105 @@
+�PNG
+
++IHDRsQ���L IDATx��w�%U�6��*�xS'�4ID�`%(`��
+�:��"����ꨘE��Q�0�g�yG�QD��Mw����'U�a�Թ�o���������kΩ�S�+��z��k���N�L�ׯ_�QGOOO�(�&�X�i<Rx��]�#����#��Ϣ�~�_X���aa���2�k�}���|��7r����x���Z"�R�����9��Vkm�WJ)�ʍ�0���0��2�R� �^��/'z�6cj������H)��sNJY�������;�AXk�ac���{��0�������ffk����&�JQ��z���FQ�ju��9W��fff����z|||ttTkm
+k�y����.MLL+���9�(���"�$I��&
+⨓�fgg+�J��b�(�z�^���p�;��71�^_����<�1\�yn��8�/_��y%e7N�tzzz�t:k\��IR��rk�<O�����lԴy�����z=)�R�(�<���Ƽ�V�35;#�H�Tk]�V�����mf�V�i�z��q`��(��v����&�3�RJH0�s�9�dК�\s@���[f�t:CCCY�%I22229>�ι$�Zk-/+�$I��֦��� �8�J4+cLi�h����xdd$C�R�U�uf���p�5���9"*��V�=��0�)��8"��\f.-�`!HH�Fchz�T�Z7&Ð(h��aOOφa�u�0���Y��Q8==��ֺ�?J�)��#���(��$�,��8v��֕JE��w37�.�"���X�۵�6+"j6�����f�aw���zC��S�������Y�Hi13Z�6�t��(K�(J��i�����ζNx���6�;>>.��B�/�=�6m��_.�C�,%�0������h�}��L���������Z���8VJu�� FFF�<7����5��{�����{ODB�333u� '?�9�i��i�*�j�-[���� �,3�8� )r�~ˇ��x�6��?�2�uE[6�{�a���,[�r����O?���o��eT����n7���۷u�QSSS��R!z��`��;�徴R�nK#BHQ��{w����n�9�c�}����瘙��/SF�@̃-0�z�0�UJ�d�ҥ��r�Ν;�l�xꩧ��}�+M�$I� �ޯY������ҥKK�a�{��/�,��`%X��q�A�`XŞ�S�[Q��/}��g���y���~5�S�ޮ�3s�{�s�;�_��Ǭy��?�Md#�i���b�Ex�cV�{��}�c��K��#3.(�D��F��;����^���W�\�t�^�����y�h�:�-��]�m%5��UN_��Wd�HV`����c���
���'?�1���7���Ӟ�}�6o����E�y�!���5���'�YK�i���w_�ի�y{���=���ر�8WXw��?uđO^�|��_y��l�� u!�F���d�����}�!D���:�g������_���g��qOX�y�ƹ���%�)���g�ݛo��/~��o������fvdd�k_��m����������&&&zi���sEQ���<ϳ,���_���w�ߺu��G��w�������2�SE�R1Ƅa�����z�^#sss7m���ko���իW�iJDZ�/~�w�y��~��믿~���7n�l6���M�6�p�+�\s+3��Ζ)v����o��k�����o?�����7+��������)`�G�,~�����+��"O�j'���.�����-[���}��w��q=^���__Ǜ�9o��}�����:��=��o��=�Ӂ�l��s�9Gk휓�Z��hh�GFG���o�t�s�ժ���jnnn||\d�N�^o4̼nݺ�<�)������~�����z�ؒ��>{�����Z��v�,����j�x��wުU��/_~��]���ݻ���o��=��o�U�?����{��Hzk������k�g�}�y�v��9773=1����p�0�#aZp���t��2�n�q���Zk�(�a�ů|��'�<<ժ�/���ӹ�̙`j��f�i�&�5����xk!T/s˖��v��+W��o��:�� ��333R�ݻ'��ߟ��>��e˗v�!7��RJ5����V�-�X�f�����]۶���o~�?�ӧ*�xǎ]���+V,��N���j����4M���7o^�z�R����j�2�?�T�^/�b||<��}�ٯ^�w�����O>y�}���������OMM�]���n�)T�X�<2���9�x��8¸��~���6���/k�HV��%g�x���l�}t$6�3=3�
-����a��EZ��;v��DEnw�رc�%K�آ��o6�EQ�q���sO9�����m����e˖��Z[dY��l
+���h��4�g�q����w��Ѩ�w�ڥ-Y�������nGQ�r��{��Z;<<<33��0˲j��s��z��Tk�v{�]s��Z�6::���p��m33SSSw�q��������^�Q<%�ȼ!&�}G���v���@�������j���3��6�w����7��������~�E����]w���?ך�g����I��s�Ν;�w}�_����{�$
+��^�GJ���{�n�Z7�����}��;�I��)*դ=;�^�a8335<���w���OZ���F5��z��|>1>����j-Y�Dq�1�\z�7nܾ}�%�\233����Ʊ����|揷�>�{��+�JӴ�q�:묏�����OOO�ر�=�y���ߦ�8��gn�t��)`�����/�K"��a\o��=9�t�7������/�ܤ��̖_�����w��0�~͋���ßv�N:�%˗�Q�0Μ�קﻪ��gw�I'�X���^��v{��(���Z�Ǐ\��+�]��_��f����8��E�7>�r���CZ���#�|�^����h4��c�)�I�EQ�V��n�V{��^�r�ʧ?��'�tҾ��EQ�Ƙ��>{�}�=ᄓ���g�i�bž���SO=��c�}�k�|���r�sw�c9��� �V����xؠ�ɝ̎�֯_�䣏����!�����j��j�q���$3����i4jY� Y���8tH���:�W����n/����zjjb�Y7Y�Jq\�eyZpc�\��:�{S#c���:&!˖�lM��fٴ�v%l����^�өV�e�m��2�%�2�z���a��+���iӦ7��+�]w]�Q%��[k��EQ$Ib�u�&I���1�Z���,��9GDZYQQ��C1�IQx8�fڕ�FA)�!�*Ȍ�q�'�`����P���v�H�n%��<'H)5�L�I����
+rpВl���=;[��B@M�J��� !�
+��`c�)+�$Ib�af)�s��_��e�Rjjjꓟ��m����?��y�J�8�M�/$�������r5���1���ءҰY��0@�E�^�������At![�������{j���<�s��x��V��y�,翖���7� �=عU*�2������r���v�i�W�mo{���X���z=弄�a��RP<A�ᔽK�0y�KI�
+@�k@�,`2 �5����)�IJ���b�*�y���A�/�W��wpY%W�������Rre��$IN8��=�E��8��3ss3B�v�]�T�������<bfO����1��*��=�V` `!���T�
+,!��Qi���z�X ��r����-��g3��{�p{��6KE�9�TY�9�5�Yk�]��J�j���tz����+
+|0�#g&����B��=�0q�������t��g�p�C0 S��/00o-���b1�2\2�}:{i������HQ�*G?�af�N+��F���i��� �2�ո�;T�`�G`�ܯ+-T��Ȑ�y��5��2�=�b ��8xFH�M��?����Cʼ_xb�-��7LJ�́<J�!~Pf)� !�������,[�lY��n�Ze�_f.?��B0��o�������� ��xC`� b^})��غ ��KQM¼��g.���Z��
+�߳S��zh1$C��pP&�Zku���'��F�g���c� �ޣ+0����,x}͵48��k,���I̫!�N0���!���W�����P����9z(�ӆ�5Y�:�eh�̩�pjj�(���e�RyZ٫<��plɞ@�K��3� !��n�^'����q�,�{#�c����<ܢ����ːX�\����@̂51$r��kO��0���
+����(��BǞlO#�:pH�Sl�ZfA�����
+J�k�P����DU�yNu�ܦ�./� *���D���پ]�0Ҫϓ}���`�c��3y@��dK� Xb�Nx&���ab}W�T������w��=�_5.��
+t���"�*�vt|_z���yK��/p���U��d��ڳ. ��J������eb'��f$u�Q��L�t��n�klơ0�dY����3 %��:MS�B!D�j�g�8���Nx!Y�c�V�%��!�"EFN�~��nA��lٲ��Ik������L9�Y?HM��yҸj=��� ��Q�?$�}���ĐD "� b0� �@�Q�E ���X � �r�HL�ŀE�8��0!dy��~� �e�d�˅�� ��$��S ��\%5Qb��rωH""b�T6�"��JD��~�,�9E.��߂A���=���+P�ă%����������O@�[��S�&���m�7�q\�V�<5&Oj��Zk]��1�+�Xa�Mi7k)B�#�X�B8OޙLxIDF:���4/l�?������)��ֺ��E144$����r{̖���o��0�x?�\�:L\�^�̬s(�8.�g��c&o��c6��s��z'9rl��8O{&S��}ߧl�1����|G���K�%���U�9��`fO��bG`0�9�=����;�gG�`8�cG�
+8��l92�
+��l���7�������%�_��`�d��13<�q�+���%x�����l4�fsrjw\��Ug�S�W�"�t:��Pk����
+���z���J�,C!�o��\P ��JU*��:��>��(��ȭV+M���(���8��!���� @�'0�\�oy��/+TC�K���� ��,{�e�ȼ+��^��;Ϲ��۴�G�Ā-�/��,�_��aQ�����}��?y����`,�Յ`*�p&�K-�Y�{V8�4�2
+���q��[���N�;�r���)��\�E�c��{�.�H}5-_���@���f�vp�X0��k֬����t[Az�PaHEa��c�c���Ƹ@���\�n�eOJ+�l�@RB���H��� �u�t�H)�T���Y�43cL�ј���T*R�믿�=�h�x��4U
+{~H&O�PѢ�z�B����H5��v�)�Gh�`a�ϕ���r{g� 0-JD��������`X4�J?X��̫ċ{����w�>�F��
+F��YH/
+�s ��r�r址r"t��?I{���s�sF����E_���6�ߎ��!���ʏ&�����u^)��i�m��{c����UW]�h4��i/ϲlɒ%�j�/�Ie�4�agI��A�����gs�^k�"���C1K9�������۫�j���������>�~���O1�<y�!|sV�E�����I�JY�\e���WNX!2�++'-��,��^z+��N���A�/E,����P��J�*������#���$�����2y�S�e�� ��F9+<��$Vz+�'�W����d�S�����c1��y��-����~?Wȇ�Z��� ��_5�m>�p�+�:ꨣ�/_�鶵���&I����k���C���z*�r�SùN�S�����+ �kw����+ߖ�'��6����֭[�.]��ַ�u�1�t�!����i�����{Ӳ�|5��,�����Î���� HQ�bB�$R�W��^�a��@0@1?"���8�ѿp���j�x-��"�����0etf��,���VC��Q�!�� ˖0Y��1O��o�5����%�z~s�x~ Y���=��ȃ �2;����]N�A��G������u�՟Q��z�n�|�Zu�����`�
+b��Rl���#(D�=D�AOY�U�1y��!��8 �5[����Y�����J�ADQ�PT�@� ���{:��}��K��_�W�*�!��I(�=� ��-r`hA"���?������'���!<[�苣}�ؓ�����B��e�yi�?j�ӄ�C����;���82bQ;x���8��*U`M���<�����l�sssI�
+ˌ �IE�����dA�0(��E+���|����p�]����>�ُ9�����P��jG�%:�%��'f)'3+k�!��Op���g��3�ރ�f�s�����<%�)
+� ��/��zޗ#�cpi/�{X�osy���C�ax�,�N?�X���Bނ`�{�x 5e'�[���,�lQ��-9�=��g|߭���gY���{������@��fݒ(�/c0��f�tv�eXf��n���+���E���s����b���c��G�2��p�,�Ugv�%�%���)CfΘ�������p{�#+��s��|�y91�B)kXc�٤Q�E��D'j�θ"3?�ُ�y�3�}�Q�}���h�a���/�0�v����E���F�#Ykm���x��KqKI7n>�O���ʋ�������t~����]{���ж���i�$U���A�����o\���k���� ��:����ͻ��R0�@
+��,`��:��;3�
+\i$8ㅖ`A�W���@(˖�l�$zi@a�:�^�X��<���e0H���s4?z3��pJ�{�Rsa*k��ʍ p�
+�e=�B2���J)di��)
+@�,O�zk�<���yS�
+[k���J9o�͋^N�<-)���YfI�<go�V�!�3��.�Or������q%�1`�������R�����xtY5��r�ƙ;�=Z�͚��_%P�q&Q�Na�٢,*�H�%��H�2�Ji��RBPI�iV,[��(l��+Q�`�0d�+��?��O}�S��+W��s�q�� Hy��Ko��E�Z�j徧��5w�݊c0`}�7�NM�fߑ��ᡵ�v�s.
+_@ h��_���l���k�_��Wݹ�+@'Q�s۫^�����Z��[n��rH�;m���'?{���Ʋ��SOy��T�� ��{MOO�Z�fddlxxt����x�M�͍�~�_=u��e��+����mؘ9`���_����i��y�k�l�)u�V>[�2А�ޘ�rJ5���E�c���VźZ�+m�4�@��1e�0�RFql�Bk}�s���~�ݳa�����D�j"�\�dt��i�x�5���� [�cG��ɤ�R�W��Ջ��>��m�_���������|��ϯW��V�s�i�ٲu���W�H�tʬ�A��G9"��9�8Lj��V +�Ppl���ܹts-;�5sζ���W*rfv!�.k��l����.�i ��Io��KBt�m�+{_��QLOOW*���X�eH��{"ڱ}���ԓ��"�s����Z��%J�ӟ���W�zrb�+7�ꠃz�_�i��B �$\CKG��u���[��oeD�@h8c��/|�Kg�}�=��ް�<�m���=��3����n�{���QO8���?'whemT��<����җ��җ�xfv���<�/x�^:1�Wt�TY�.]�쮻�ںu�~��A����Z���}������v���n��c���W�n��\�T>{��oxÛ�nݺ~���wř�~��-��j��;���W�����c�ֱ%�Ss/�|�؆uwm�z�T�5;�
+$�!�![� IDATS�VK�O~�+�����R����z��qㆢȊ<����o���lԇ�ݼu|b|��}{�\ih�M��|�_x��^�����u��kN?�5�^:Ӛ��7���7������MO>���Oa�ڮ�RA��+B�����\kn�5��ۖ-+��=T����ڑ��k9��A\m�4 �q�39M̌G\ۨ��q̦��.>묳�'vH�d�=���|f���CC#g��uSSS�V�裏ٴiӪU������̏~��'=�)�z����WvӢZ�����/xыt�Y��-o��^7kuS�`�0�"�v�v�W�
+��\��W����'�426������oܴ���H�v�袋�#͡7���N�G%j�\
+�"����\�W�2�&q�rꩧ���z�ű5&�c�v��v�[�h4jߺ�;����8P��+��v/Ϭs�W�����<-n4Ɩ.}�����q��g���:��Mw�.ο�������z�^�8P֒��6�la:-"8�e��Z��{|���~�%�\���v 8�� �$� �B����y�R�S�E�W_�ՓO<������vj��fy�>t��W��'A �:�����NL���+���<P�l�G��r�4���I&�
+$��9��^����r]E�MH.i�r��RK�<FG��� �=f����B��j��K.���7�|��p�-��T*�}�{����^�w�����_�nݺ^�w����?���V����;;�N��C��w���}�{?�5>��t�Ѐ+�������V�S _Ff��ΰ�CCC��+_�L�Q�sF>��[�n]��~��Z�<{��{�W�D����^�rA` �Q�R _X�eE������dlB%�]Q(�;���~hhdxx���o���Y?�ޤ_��V�\366l`���������1�o]EW}��'�t� '�EQ/�Hsx�>˲�v�ԕxfz��C�ٺ}�P2�3@|��O<�O:�y����������%!�x���p���0��##���45Z��L�-20DN�lۺy�2Ѕ/�X�:���~��##cI��ǃ"�ct����<�:g��%��a�s�3c�Lƽ��RQ�:F�{r�^m���uM�sQ
+1A�4�Z�
+CR����'>�b�
+)�[��֗���]�;GƖJ)����W����>��g=�Y�v5C��8�T�U���͛�p��k���/���uu��?^xᅟ��_u+���JE��,OL̬iT!M{Fǣ�"���7�t����kI��}�)/|������W�K�a�ܻDH!4<l����O<d|��������ل)#M"�q��ZaZι����kW;)HkPwz� ��m���Ǿ=@!��d�����������e?Y���xg����?��O��'߹���U��!�D�{�T##��lA6cf��{E��7���_��[��F���� C����pk'n�í^x���?��O_i!!���Qoy��AA�N��m��H(��o��y��o/���j���E���[�y|���ڵ߽��D�"QХ�' �@�G=<�R���p)��YQ�>o5�f3�7b�]��c�r3�@��)&��Vd�q�)�ѕ>�}��BR�%c�wnWJ���_�|���Z�n��8^�vmqN����}nnnɒ%�n���㳟��G?���?�Z���]�:�W������o���_��O~�{Ox�(���i��QU��6�T�İ�o~�w����\v��G�p����֧=턯]�����N?묷��G���9�*,*͡+�l���_���=��o^���%`H2M��8���T*�C�(�����w����?_���������K�`;����g^���:���|F(���g?}�G?����e���g��^BdY���gZ�F�`���w�P楥i���|���p�ј�� ð�o�}'N���q啗�x����v��|���NMMՇB)���
+@� n��o�y�韾�;j�����X�eKZ������{���%+``��~��`֔G-�����ٵZ��6���_��w�y��,��H[K�\ݦC���;�BD�p����B�K��U)>�>zf��f��Q���R��P���;�8�Abzz���c���Z��ܻϊ���eY���D��\�T��H�<��G|�ꫳ�{�on<�s^p�q�ҥ���~|ù�^p�U?|�ӏ 4��P�qlu��bw��b��+�͡5����~p���������������rg����i��)8��|��gعv׀�3
+8�����C��z�5�|!���KUud,�!��$���^t ¤������������I���d�������|�������<B*�$0�AW���;���j!��:���y��7��\�h�6ﭨ�q/WI�\J��������pï���'�q��9=��ǯ_�~��̰�H�
+���=��e�+0u�Gk�n�#�+��$T���M��?<�]���?]��㏯yntXg�Qr����+�x�p<���ԅd���m�I����B8!�1�z������=��/;�`�j>~��ccԛ�^)�+=�6��rF�ݵ�y�Hc�+m|Z�Ő�$E����O��G��X�����'�����w��wOMN��]�:�����4��G�qÆ{��ۗ]v١��jH)�z�Ƹ���[��o�)M�R�`f__��W�;O~���z�1���PR(��5�J�Yj���jy��?�|}�UW]u�{��嗟��S��SRU*��ѥ�]vY��y����}�Z�&I�j���c�.�d��oy�[n��+aN�L_z�q3s��;� �n��@�n{>�GC�Q�nrb������;�j��)���f�Y�^~���{��.����;��qp�v��ÏعsZkR��'�-�<ݶm����_���CC+�2 Q�y*%%I`���������ƚF��m�6fn�Z���Ozғ6mڴbŲ������m�֭����g�=��?|ȁ�z�/CL��7n<t�
+ ��_���]~�姞|<�V'����9�������|jj�K.Y�t)EQ �cc\i�+�T͢�/cƄ0���Ƙ,Ϳ��k~��7o�����{�u�o�ذ~��m�閭�ٖ�������O���{�pۆ?�3���Ϳ��߿���>�k������B^����������>���rH�o~jZ�8�9��<��e˖�iz��!$3ONNFQ�٬���s���V��o���ǖ-���}�{��+O{�S���Z�zc�s�k��En�]�fM�V����:hm�6�i�����~�C�֭{�����Ju�ҥ[�l�J����v��X�������^y�ժ̲l��q�Y��i����w�;��k��{�_��WF�F�ݶ���r���9x����o�e���Ն�n���Qm<���>묳FG��X��m��v��_^��>�{�����<��g5�TR�U7m�\�<.6��B�8��sR�8��o߾f͚����n�m�ʕ���7n,�b���SSS�{��1n^Ey�w��<��4o4��;�3�<��<�裃 �ܕ��b��u?����%wܹ���Yr�ƭy��MO��\�n��ǟɨY_v���z�GF�^���y晣��t��ݻ/���f���e�z)Ik ��]+��2Z�G��Z��IX��U������M�E�`�L��+�h�l29���7�^u&�G�
+vN���;n��[z�=�O�[4�1�L�d���뼇ܘ��{"��w�{�QG|� J���V��s�`��%���n�$1z�"I��kM��WJcJ��&Zù<O�$`I�tM����ƶtP>��V�Vk0�Ձ�ec�$T��S�l�)�j5��n�������R�
+�)�0���f���w,���<�CSx��t{i%�#�\��������8�0�����p���r@y
+�g�0�.)�"��N�]�ղ4����+i�'�B�?�TX�J��_����*��-�%�v[*TPA��*(@"�- (,��M k}9�Cki�+�PJ�eE�n`��,%+&My�����K�9�T/XJi��B
+�_��s�����ܬ�������Z٧Y�l�lk*���37��8{�O�+�H��a܍��;�D�7+��R��Z�k58 �6�U:�%��V+1�H��֚� ��y�LeTAdi%��:�t�jR�
+C��sT=ߣ:�J��3`�����@8fv���Ca�D(��"A�A����"�"��w�h8�8V�4��Q)H�l4�u��8)��묵��T��*���[f�4���?�:)!C���aP�<C�:�鶚�Q)�,�D��U*
+B�Q�gY�VEQ�ժ��E��IR�w��0+.�Z��J��T��� ϊ0
+��`��RQ9��A% �)h!X�Bj@���" �3Z�R�<��<c�N'�8
+�z�$I���7��"�E0��(5 �~�Z���g<������1�Y��v�g�\����_=�ȡ�)�0���y�A�����ˆ�Rm�c�O<�c�f̛�*�{*�H�4�ck=�U_���˒$"B�嫏��(J�"σ ���"�q�����L"�q��^�S�T:��(�<�c� k�{JIQNMO��^)QE���5��
+����@5��wRHc2cL%�8ku9=Ck�;�J*%�V�^�����DT��1Dlm���ʡ�D\I*��R�Y��dYQ��J���%a �"0���5��Z�n�"CZ�R��ΕuIU �^��q�����]�Ri �����Q��?��@Q�HH�\ %�+�I��Ɛ�_� �{TҊ��Z[�V˒=��Q��,*���<@J��<�|hx�iO<���Wu��i��Q74�����W��S��bC2�����腯|���S�3O(�*\����W<�|R�#�κ�(����6�be�-�"縒D�w��?��*�(S�!�E+��BU^)ᙥ$%�yS�J�ea Q��cra��B��B��[T)�-:0E�C��n�Z�Z�c|9��0;��@k]����R;WHN���hH�g�ׁ0��`hZ)�+k�yOHh�H�<�B�c)�1E�J`n��h�sQA6��/�<�"O�0ԡ;�V��Ӣt��1�� �(�i3ƄQP�ם�R)k��1y("��!bH��Py�G��#�*�"@I�%���J�y��Y�����Ƙ2�5H��,���B�,�l��^+�\��$+J��M-vd:��f�uѨ���t����l�Z�7����Z�#��Z�D�%�\Q��ڨRq��$�T
+p�-ι �,����������9��(u\��< �@) �˱�Dd�1EFQ�xgt���BE�����sR��YA��,$��:����Z�^��Z��k)ʢ3RBPZ)�Rh(����c�UR�!%t Lau ��lm?FB�AF:�A�Y7�u������a`p^�F�Tp�s�������"S�g�\���4UZ�c��(����0
+���\^JPE��(�a$�26�>�i�����T*y�S��Ҙ�B T���gvB I"�D�V)!%1�(<�X�<���Ʊ��Ulj+��2�-[�*͢i�k4r�JLt&�Mm�U��ga-٨�F%���ZЌPy(f)�,.8��w�o~�H��i~�� �q� /%>����K�%Bb�����W�p�4�u��BZi��l���jx0���U��K����l��P��IV�2����/n��jq��?�@��tH���BJ,�m)�b�E����O��85���Wr����+�����`A�]X��'��&��~�*��`%�� A@e���i~�DT�%���x���_��ӟ��(���B�T����:���ځlj���P�PD>w>3�T�lgo�4OO���v�t���hDg�e�N�(NQ����\��m6�QMOO�z�����o}��}�YA���ÃWOa�=��ެ������߫+~�m���{��_� �x��՞I���~�G;8 V��|6�����>װqDʗgOp�#��\���^�I��^Z�ĆUx�3�6�d�1�-
+�I)�����l�VS��ԭ�L�k��z�Y(�.�ڽ��h��N�L�������륩���
+β졘E)%���,�=9>�z�ꑑ�d�}���9z$����o?�D�#5�w�rj��6y������n�CQ��=��~A�~�m��U��9 X����3��S䲧����'e�,������\2�rЎ�V�ls��0� ��;��6�#������]��%5r
+�@��O�pnEOE�C���?Q��@sh��A}���q�؍kS�����aH��l�tZ���DR���r�W��͏��sΘ(b�9�\Q��m�y5�)�86�t6+w�9��{?)���8���d�B���8Rc�eU]mR��i�]�VU�x<>88x��YUUeYVU�?^nw����5��9�X�����WT�_��@2��;� �8����-`@�$�VY��\�/���a�#���� 靴F"D4��t�[#�5�_������.���"��ޢA���f~r2ͬ;z��o���pTѨ<�c?�M]�w��'/�o��7�G�3��'��]���5��\������\ۭk��ӧOwww�\|kb|C�`�yZ�p%�4�x��Ko�]t�|o0� � ��B��`��*�n��'f���tzK}� zF�V�e$+h- Xa��I�Ʀ�w� �h���ۦ&�,������������b��16����wt���g�������Y�$��_�t�=3F�;���k�ș�&'GGG��!��x<���]�s�ƍϟ?�o�ʹ��V��7�Vg�Yea:{� �+�H���odA��i� �/�,;� �Z��� �mk#�kW�ϝ'�tV=7%�*a@Z��8 ulq �m��*K���SF���xc�B����m۪� � ϛ�2E��5<�����ܸ��_�}V����My1Fn{��E:���Ǐ7�Cu]��B��ι<����](+���&�YV���(��4�j�ੲ0��9e��2ZV`���歼Ɨq��E 4 vi���� �& �6*|�/�l��Sq �"�HV-�k9��L,G��E���,W�y�(����,����������������L�SG8�� o���`Fqx�(���~�A�5�I�9�@�� ̲ �_��+�
������1&��Y?p�5��V�k��TY��<>�.~�㋠��_�蕠0��a�n|<�E��1�Z!�FjX�k�eW#�Ahqض�f�wm5�~��[;1A^�#2b/�"/.�pO�����,�)�J����w�1��c�@���'�|����(
+�2��G�����N��l���q�'8���xPMN�-㘻�Z����N������DDDĮ��<!h�i��D"qI!l��{��\0DdfM?6����*���u�6�,��繈t]���DlۖRpT"qiq��;w����vhX�6�%�0�E`-���ڣA�ZRD�;W9>�D��1��|�����|ctΩ���Xa���/��9�4�f�Y�e��)y��Kk�x��º3�e���[寯�6�m- }�&e���eY�}��9�e9�Z��,�ĥ�Y&u�hq��1Fm���!j�l��1^`�E�eY۶u]�������Z���$������,UStEb�Ue�1Y-Y�]CmR�Ut�g������S��D��2�Nc�UU9���ީ�Z�}����k��⽡�`ж�v�0��f����e�D"q�1�e�'����q�>XI̶�_�g�X���x�A$%�%��f���}������/�!4M��-�٬(�mm�B��)�,�H|��W���ׯ_�֮
+��,�-w�јns}�3��ĕc2�ܺ�h��IDATu�@KGz��*��j�n�{�H$�&�X�eh��*�]o�q��&��,�D�_�f��ꞑF���o���x;eI����Y@���̼
+��j��|nL��H$@]��Ț�<(����gѠ*]�D"�7�K�+�i��������%�+%W�c�eM�h'L-&i�i�h+�[�����h���횾�F$���0���_�&.�.�>�!kmQ�z�>ELYˉDBW"D*]�i`��~2���*��"z���>���t��g���_E�&?K"�X�{:��gy��Q���>��O`/����y�4"R��&.ݾ}{gX&eI$eYk'''MӌF����{������h~��v�n���Ǐ>�裤,�D�뺶iq4������1�鴚�V+�U�9p��f3����~����p��͇~��IY�����5��i��'O�án�h����P�A�����?��f�t<���?V0H�n��IEND�B`�
\ No newline at end of file
1
0