Skip to main content

Twisted-based Tor controller client, with state-tracking and configuration abstractions.

Project description

Full, built documentation at ReadTheDocs https://txtorcon.readthedocs.org

https://travis-ci.org/meejah/txtorcon.png?branch=master https://coveralls.io/repos/meejah/txtorcon/badge.png

quick start

For the impatient, there are two quick ways to install this:

$ pip install txtorcon

or, if you checked out or downloaded the source:

$ python setup.py install

To avoid installing, you can just add the base of the source to your PYTHONPATH:

$ export PYTHONPATH=`pwd`:$PYTHONPATH

Then, you will want to explore the examples. Try “python examples/stream_circuit_logger.py” for instance.

On Debian testing (jessie), or with wheezy-backports you can install version 0.8.2:

$ apt-get install python-txtorcon

You may also like this asciinema demo for an overview.

overview

txtorcon is a Twisted-based asynchronous Tor control protocol implementation. Twisted is an event-driven networking engine written in Python and Tor is an onion-routing network designed to improve people’s privacy and anonymity on the Internet.

The main abstraction of this library is txtorcon.TorControlProtocol which presents an asynchronous API to speak the Tor client protocol in Python. txtorcon also provides abstractions to track and get updates about Tor’s state (txtorcon.TorState) and current configuration (including writing it to Tor or disk) in txtorcon.TorConfig, along with helpers to asynchronously launch slave instances of Tor including Twisted endpoint support.

txtorcon runs all tests cleanly on:

  • Debian “squeeze”, “wheezy” and “jessie”

  • OS X 10.4 (naif)

  • OS X 10.8 (lukas lueg)

  • Fedora 18 (lukas lueg)

  • Reports from other OSes appreciated.

If instead you want a synchronous (threaded) Python controller library, check out Stem at https://stem.torproject.org/

quick implementation overview

txtorcon provides a class to track Tor’s current state – such as details about routers, circuits and streams – called txtorcon.TorState and an abstraction to the configuration values via txtorcon.TorConfig which provides attribute-style accessors to Tor’s state (including making changes). txtorcon.TorState provides txtorcon.Router, txtorcon.Circuit and txtorcon.Stream objects which implement a listener interface so client code may receive updates (in real time) including Tor events.

txtorcon uses trial for unit-tests and has 96% test-coverage – which is not to say I’ve covered all the cases, but nearly all of the code is at least exercised somehow by the unit tests.

Tor itself is not required to be running for any of the tests. There are no integration tests. ohcount claims around 2000 lines of code for the core bit; around 4000 including tests. About 37% comments in the not-test code.

dependencies / requirements

  • twisted: I am working against Twisted 11.1.0 on Debian with Python 2.7.2. Twisted 12 works fine as well. Twisted does not yet support Python 3.

  • GeoIP: optional provides location information for ip addresses; you will want to download GeoLite City from MaxMind or pay them for more accuracy. Or use tor-geoip, which makes this sort-of optional, in that we’ll query Tor for the if the GeoIP database doesn’t have an answer but I haven’t bothered removing the dependency yet. It also does ASN lookups if you installed that MaxMind database.

  • python-ipaddr: optional. Google’s IP address manipulation code.

  • development: Sphinx if you want to build the documentation. In that case you’ll also need something called python-repoze.sphinx.autointerface (at least in Debian) to build the Interface-derived docs properly.

  • development: coverage to run the code-coverage metrics

  • optional: GraphViz is used in the tests (and to generate state-machine diagrams, if you like) but those tests are skipped if “dot” isn’t in your path

In any case, on a Debian wheezy, squeeze or Ubuntu system, this should work:

apt-get install python-setuptools python-twisted python-ipaddr python-geoip graphviz
apt-get install python-sphinx python-repoze.sphinx.autointerface python-coverage # for develoment

Using pip this would be:

pip install Twisted ipaddr pygeoip
pip install GeoIP Sphinx repoze.sphinx.autointerface coverage  # for development

or:

pip install -r requirements.txt
pip install -r dev-requirements.txt

or for the bare minimum:

pip install Twisted  # will install zope.interface too

documentation

It is likely that you will need to read at least some of control-spec.txt from the torspec git repository so you know what’s being abstracted by this library.

Run “make doc” to build the Sphinx documentation locally, or rely on ReadTheDocs https://txtorcon.readthedocs.org which builds each tagged release and the latest master.

There is also a directory of examples/ scripts, which have inline documentation explaining their use. You may also use pydoc:

pydoc txtorcon.TorControlProtocol
pydoc txtorcon.TorState
pydoc txtorcon.TorConfig

…for the main classes. If you’re using TorState, you will also be interested in the support classes for it:

pydoc txtorcon.Circuit
pydoc txtorcon.Stream
pydoc txtorcon.Router
pydoc txtorcon.AddrMap

There are also Zope interfaces for some things, if you wish to listen for events for your own purposes (the best example of the use of these being TorState itself):

txtorcon.ITorControlProtocol
txtorcon.IStreamAttacher
txtorcon.ICircuitListener
txtorcon.IStreamListener

For launching Tor and Twisted integration, you will want to look at:

txtorcon.launch_tor (in torconfig.py)
txtorcon.TCPHiddenServiceEndpoint (in torconfig.py)
txtorcon.TorProtocolFactory (in torcontrolprotocol.py)
txtorcon.build_tor_connection (in torstate.py)
txtorcon.build_local_tor_connection (in torstate.py)

IStreamAttacher affects Tor’s behaviour, allowing one to customize how circuits for particular streams are selected. You can build your own circuits via ITorControlProtocol.build_circuit(). There is an example of this called custom_stream_attacher.py which builds (or uses) circuits exiting in the same country as the address to which the stream is connecting.

contact information

For novelty value, the Web site (with built documentation and so forth) can be viewed via Tor at https://timaq4ygg2iegci7.onion although the code itself is hosted via git:

torsocks git clone git://timaq4ygg2iegci7.onion/txtorcon.git

or:

git clone git://github.com/meejah/txtorcon.git

You may contact me via meejah at meejah dot ca with GPG key 0xC2602803128069A7 or see meejah.asc in the repository. The fingerprint is 9D5A 2BD5 688E CB88 9DEB CD3F C260 2803 1280 69A7.

It is often possible to contact me as meejah in #tor-dev on OFTC but be patient for replies (I do look at scrollback, so putting “meejah: “ in front will alert my client).

More conventionally, you may get the code at GitHub and documentation via ReadTheDocs:

Please do use the GitHub issue-tracker to report bugs. Patches, pull-requests, comments and criticisms are all welcomed and appreciated.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

txtorcon-0.9.0.tar.gz (160.0 kB view details)

Uploaded Source

Built Distribution

txtorcon-0.9.0-py27-none-any.whl (150.4 kB view details)

Uploaded Python 2.7

File details

Details for the file txtorcon-0.9.0.tar.gz.

File metadata

  • Download URL: txtorcon-0.9.0.tar.gz
  • Upload date:
  • Size: 160.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for txtorcon-0.9.0.tar.gz
Algorithm Hash digest
SHA256 267ef64d0fb73e3f71aea4a6fb2b712f157961f6b63b21c0342f9ac309622b51
MD5 af64e24f8463be031c950fdc2194d79b
BLAKE2b-256 03798005ef12adccc6de269a585eea58b015667fd450f4e0990c4ed62ddbbe97

See more details on using hashes here.

File details

Details for the file txtorcon-0.9.0-py27-none-any.whl.

File metadata

File hashes

Hashes for txtorcon-0.9.0-py27-none-any.whl
Algorithm Hash digest
SHA256 06b518fa5aa98fb56e3b0086842a9418878d2440abfc94463d59df9ffaf898c4
MD5 774fce0173e9bf54ef58c822656353f2
BLAKE2b-256 60f6024d173a65d3ba10645f6b895a2f3601eda50eb76777f289fe061e40bdfc

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page