[tor-dev] grabbing Tor circuit (node) data- Tor stem, torrc and Tor control port

Damian Johnson atagar at torproject.org
Tue Jun 11 03:08:22 UTC 2013


Hi Sarah. I'm not really sure what you're trying to ask in most of
these questions. Assuming that your goal is simply 'I want to connect
to port 9051 and dump information about all the relays I'm presently
using in my circuits' then the following should do the trick.

Take the following with a grain of salt - I just wrote it, I haven't
tried running it. Should be close though. ;)

from stem.control import Controller

with Controller.from_port(port = 9051) as controller:
  my_relay_fingerprints = []  # fingerprints of all relays in our circuits

  for circ in controller.get_circuits():
    my_relay_fingerprints += [fp for (fp, nickname) in circ.path]

  for fingerprint in my_relay_fingerprints:
    desc = controller.get_network_status(fingerprint)
    country = controller.get_info("ip-to-country/%s" % desc.address, "unknown")

    print "relay: %s:" % fingerprint
    print "  address: %s:%s" % (desc.address, desc.or_port)
    print "  locale: %s" % country


Did you have any other questions?

On Mon, Jun 10, 2013 at 9:43 AM, SARAH CORTES <sarah at lewis.is> wrote:
> Damian, thanks, this is very helpful.
>
> is there a way to do this in torrc? Else, i suppose i will need to:
>
> 1) create a socket or connection to my port 9051 ; do i need/can i use
> TORRC_CONTROL_SOCKET ?
> 2) call get_circuits() ; grab the relay fingerprints
> Do I need circuit = controller.get_circuit(circ_id)
> 3) return class:`stem.events.CircuitEvent` ; for the given circuit
> Not sure whether or where to use the "path" attribute
> 4) call controller.get_network_status() to get IP address, nickname, ORPort,
> Should I use:
> desc_by_fingerprint = controller.get_network_status(test_relay.fingerprint)
>
> 	+      desc_by_nickname =
> controller.get_network_status(test_relay.nickname)
>
> 5) use Maxmind- i already have the GeoIPLite DB to grab AS and country, and
> onion code also from Arturo
>
>
> Any guidance is appreciated
>
>
> https://lists.torproject.org/pipermail/tor-commits/2012-December/051174.html
>
> get_circuit(self, circuit_id, default = UNDEFINED):
> +    """
> +    Provides a circuit presently available from tor.
> +
> +    :param int circuit_id: circuit to be fetched
> +    :param object default: response if the query fails
> +
> +    :returns: :class:`stem.events.CircuitEvent` for the given circuit
> +
> +    :raises:
> +      * :class:`stem.ControllerError` if the call fails
> +      * ValueError if the circuit doesn't exist
> +
> +      An exception is only raised if we weren't provided a default
> response.
> +    """
> +
> +    try:
> +      for circ in self.get_circuits():
> +        if circ.id == circuit_id:
> +          return circ
> +
> +      raise ValueError("Tor presently does not have a circuit with the id
> of '%s'" % circuit_id)
> +    except Exception, exc:
> +      if default: return default
> +      else: raise exc
> +
>    def get_circuits(self):
>      """
>      Provides the list of circuits Tor is currently handling.
>
>
>
> On Jun 10, 2013, at 10:34 AM, Damian Johnson <atagar at torproject.org> wrote:
>
> Hi, Damian, thanks. I am happy to discuss it on tor-dev at . But I want to keep
> off spam, which some of my questions at first may be, essentially Qs. But,
> if you think they would be of interest to tor-dev, or others could help,
> just let me know, and i will sign up for it.
>
>
> They certainly are! If you're interested in tor and development then I
> would definitely suggest being on that list. Including it for this
> thread.
>
> I am trying to figure out how to pull in the nodes that are actually used in
> my Tor circuits. They are the nodes reflected in the Network map function.
>
>
> You want the get_circuits() method. As you mentioned the 'path'
> attribute has the relays in your present circuits...
>
> https://stem.torproject.org/api/control.html#stem.control.Controller.get_circuits
>
> I have created a MySql DB of some of my Tor circuits and nodes which i am
> analyzing. I grabbed 48 circuits with their 144 nodes and info (IP address,
> nickname, country) manually from my laptop's Tor network map.
>
>
> That certainly sounds painful. The circuit paths will provide the
> relay fingerprints which you can use for get_network_status() to get
> the address, nickname, ORPort, etc...
>
> https://stem.torproject.org/api/control.html#stem.control.Controller.get_network_status
>
> As for locales that would be done via get_info('ip-to-country/<address>')...
>
> https://gitweb.torproject.org/torspec.git/blob/HEAD:/control-spec.txt#l672
>
> ... and ultimately to AS and country.
>
>
> AS will require the Maxmind AS database or something else. I know that
> Onionoo includes the AS information so the options that come to mind
> are either to (a) see how it does it or (b) query Onionoo for this
> information.
>
> https://onionoo.torproject.org/
>
> And i have read much of the control-spec, don't know how much is out of date
>
>
> The control-spec should be up to date. If there are any inaccuracies
> then please let us know!
>
> Did you have any other questions? -Damian
>
> On Mon, Jun 10, 2013 at 4:44 AM, SARAH CORTES <sarah at lewis.is> wrote:
>
> Hi, Damian, thanks. I am happy to discuss it on tor-dev at . But I want to keep
> off spam, which some of my questions at first may be, essentially Qs. But,
> if you think they would be of interest to tor-dev, or others could help,
> just let me know, and i will sign up for it.
>
> For example, I am trying to figure out how to pull in the nodes that are
> actually used in my Tor circuits. They are the nodes reflected in the
> Network map function. I have read your fine stem tutorials, it is so
> impressive you have dome so much work and documentation on your own
> initiative. It is certainly a huge help to me and otter researchers like me.
>
> I have created a MySql DB of some of my Tor circuits and nodes which i am
> analyzing. I grabbed 48 circuits with their 144 nodes and info (IP address,
> nickname, country) manually from my laptop's Tor network map. I am analyzing
> their country, so I am seeking to map nickname or fingerprint of the node to
> IP address and ultimately to AS and country. Ultimately, I am analyzing
> jurisdictional arbitrage and the hostility factors of differ countries to
> Tor traffic, and whether it is possible to incorporate country or AS in to
> the Tor path algorithm.
>
> I can see the entry guard nicknames and fingerprints in my state file and
> pick them up there, if necessary. Wish i could just edit the logs to display
> all nodes, then figure out how to map the node fingerprint or nickname to
> its IP address them AS and country. I understand there is a Tor atlas
> function but have not read it carefully yet.
>
> I have read documentation on the contents of the consensus file, the
> descriptors, geoip and state files, and played around with them a bit to
> understand them. I grasp that a fingerprint is a hash of the node's public
> key, and one or both of which seem to be the most reliable ID for a node.
>
> I can see from your documentation that variable path(nickname, fingerprint)
> contains the data i want. Just need to be able to get that data easily. Not
> sure if editing my torrc file is the way or what. If you have any
> suggestions, they are much appreciated.
>
> And i have read much of the control-spec, don't know how much is out of date
> https://gitweb.torproject.org/torspec.git/blob/HEAD:/control-spec.txt
>
> I have read this on modifying torrc, and played around with modifying torrc,
> on an elementary basis:
> https://www.torproject.org/docs/faq.html.en#torrc
>
> and some tickets on modifying torrc
> https://trac.torproject.org/projects/tor/ticket/6147
>
> and what I believe is your excellent documentation on stem events;
> https://stem.torproject.org/api/response.html#stem.response.events.BandwidthEvent
>
>
>
>
>
>
>
> On Jun 8, 2013, at 2:31 PM, Damian Johnson <atagar at torproject.org> wrote:
>
> Hi Sarah. Yup, I'd be more than happy to help if you have any stem
> questions. Email would definitely be better since we look to keep
> missing each other on irc. I'd appreciate it though if we discussed it
> on the tor-dev@ email list...
>
> https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-dev
>
> On Sat, Jun 8, 2013 at 3:42 AM, SARAH CORTES <sarah at lewis.is> wrote:
>
> Hi Damian, I'm Sarah Cortes, a researcher. I tried you on irc on #tor-dev
> but was unable to reach you. We met at the tor dev meeting which i attended
> in March. I have some Qs for you regarding stem. Please let me know if you
> are available, thanks
>
>
>


More information about the tor-dev mailing list