second
This commit is contained in:
parent
79b2296285
commit
e41515a8a7
12
Makefile
Normal file
12
Makefile
Normal file
@ -0,0 +1,12 @@
|
||||
LOCAL_DOCTEST=/usr/local/bin/toxcore_run_doctest3.bash
|
||||
DOCTEST=${LOCAL_DOCTEST}
|
||||
|
||||
lint::
|
||||
sh .pylint.sh
|
||||
|
||||
rsync::
|
||||
bash .rsync.sh
|
||||
|
||||
doctest:
|
||||
export PYTHONPATH=${PWD}
|
||||
${DOCTEST} stem_examples.txt
|
167
docs/compare_flags.html
Normal file
167
docs/compare_flags.html
Normal file
@ -0,0 +1,167 @@
|
||||
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Comparing Directory Authority Flags — Stem 1.8.1-maint documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="../../_static/haiku.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../../_static/style.css" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '../../',
|
||||
VERSION: '1.8.1-maint',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="../../_static/jquery.js"></script>
|
||||
<script type="text/javascript" src="../../_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="../../_static/doctools.js"></script>
|
||||
<link rel="shortcut icon" href="../../_static/favicon.png"/>
|
||||
<link rel="top" title="Stem 1.8.1-maint documentation" href="../../index.html" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="header"><img class="rightlogo" src="../../_static/logo.png" alt="Logo"/><h1 class="heading"><a href="../../index.html">
|
||||
<span>Stem Docs</span></a></h1>
|
||||
<h2 class="heading"><span>Comparing Directory Authority Flags</span></h2>
|
||||
</div>
|
||||
<div class="topnav">
|
||||
|
||||
<p>
|
||||
|
||||
<ul id="navbar">
|
||||
<li><a href="../../index.html">Home</a></li>
|
||||
<li><a href="../../tutorials.html">Tutorials</a>
|
||||
<ul>
|
||||
<li><a href="../the_little_relay_that_could.html">Hello World</a></li>
|
||||
<li><a href="../to_russia_with_love.html">Client Usage</a></li>
|
||||
<li><a href="../tortoise_and_the_hare.html">Event Listening</a></li>
|
||||
<li><a href="../over_the_river.html">Hidden Services</a></li>
|
||||
<li><a href="../mirror_mirror_on_the_wall.html">Tor Descriptors</a></li>
|
||||
<li><a href="../east_of_the_sun.html">Utilities</a></li>
|
||||
<li><a href="../down_the_rabbit_hole.html">Interpreter</a></li>
|
||||
<li><a href="../double_double_toil_and_trouble.html">Examples</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="../../api.html">API</a>
|
||||
<ul>
|
||||
<li><a href="../../api/control.html">stem.control</a></li>
|
||||
<li><a href="../../api/connection.html">stem.connection</a></li>
|
||||
<li><a href="../../api/socket.html">stem.socket</a></li>
|
||||
<li><a href="../../api/process.html">stem.process</a></li>
|
||||
<li><a href="../../api/response.html">stem.response</a></li>
|
||||
<li><a href="../../api/exit_policy.html">stem.exit_policy</a></li>
|
||||
<li><a href="../../api/version.html">stem.version</a></li>
|
||||
<li><a href="../../api.html#descriptors">Descriptors</a></li>
|
||||
<li><a href="../../api.html#utilities">Utilities</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="https://trac.torproject.org/projects/tor/wiki/doc/stem">Development</a>
|
||||
<ul>
|
||||
<li><a href="../../faq.html">FAQ</a></li>
|
||||
<li><a href="../../change_log.html">Change Log</a></li>
|
||||
<li><a href="https://github.com/torproject/stem/issues/">Bug Tracker</a></li>
|
||||
<li><a href="https://jenkins.torproject.org/job/stem-tor-ci/">Jenkins</a></li>
|
||||
<li><a href="../../download.html">Download</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="../../faq.html#where-can-i-get-help">Contact</a>
|
||||
<ul>
|
||||
<li><a href="https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-dev">Email List</a></li>
|
||||
<li><a href="https://www.torproject.org/about/contact.html.en#irc">IRC</a></li>
|
||||
<li><a href="https://www.atagar.com/contact/">Author</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
<div class="content">
|
||||
|
||||
|
||||
<div class="section" id="comparing-directory-authority-flags">
|
||||
<h1>Comparing Directory Authority Flags<a class="headerlink" href="#comparing-directory-authority-flags" title="Permalink to this headline">¶</a></h1>
|
||||
<a class="reference external image-reference" href="../double_double_toil_and_trouble.html"><img alt="../../_images/back.png" src="../../_images/back.png" /></a>
|
||||
<p>Compares the votes of two directory authorities, in this case moria1 and
|
||||
maatuska, with a special interest in the 'Running' flag.</p>
|
||||
<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">collections</span>
|
||||
|
||||
<span class="kn">import</span> <span class="nn">stem.descriptor</span>
|
||||
<span class="kn">import</span> <span class="nn">stem.descriptor.remote</span>
|
||||
<span class="kn">import</span> <span class="nn">stem.directory</span>
|
||||
|
||||
<span class="c"># Query all authority votes asynchronously.</span>
|
||||
|
||||
<span class="n">downloader</span> <span class="o">=</span> <span class="n">stem</span><span class="o">.</span><span class="n">descriptor</span><span class="o">.</span><span class="n">remote</span><span class="o">.</span><span class="n">DescriptorDownloader</span><span class="p">(</span>
|
||||
<span class="n">document_handler</span> <span class="o">=</span> <span class="n">stem</span><span class="o">.</span><span class="n">descriptor</span><span class="o">.</span><span class="n">DocumentHandler</span><span class="o">.</span><span class="n">DOCUMENT</span><span class="p">,</span>
|
||||
<span class="p">)</span>
|
||||
|
||||
<span class="c"># An ordered dictionary ensures queries are finished in the order they were</span>
|
||||
<span class="c"># added.</span>
|
||||
|
||||
<span class="n">queries</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">OrderedDict</span><span class="p">()</span>
|
||||
|
||||
<span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">authority</span> <span class="ow">in</span> <span class="n">stem</span><span class="o">.</span><span class="n">directory</span><span class="o">.</span><span class="n">Authority</span><span class="o">.</span><span class="n">from_cache</span><span class="p">()</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
||||
<span class="k">if</span> <span class="n">authority</span><span class="o">.</span><span class="n">v3ident</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
|
||||
<span class="k">continue</span> <span class="c"># authority doesn't vote if it lacks a v3ident</span>
|
||||
|
||||
<span class="n">queries</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">downloader</span><span class="o">.</span><span class="n">get_vote</span><span class="p">(</span><span class="n">authority</span><span class="p">)</span>
|
||||
|
||||
<span class="c"># Wait for the votes to finish being downloaded, this produces a dictionary of</span>
|
||||
<span class="c"># authority nicknames to their vote.</span>
|
||||
|
||||
<span class="n">votes</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">((</span><span class="n">name</span><span class="p">,</span> <span class="n">query</span><span class="o">.</span><span class="n">run</span><span class="p">()[</span><span class="mi">0</span><span class="p">])</span> <span class="k">for</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">query</span><span class="p">)</span> <span class="ow">in</span> <span class="n">queries</span><span class="o">.</span><span class="n">items</span><span class="p">())</span>
|
||||
|
||||
<span class="c"># Get a superset of all the fingerprints in all the votes.</span>
|
||||
|
||||
<span class="n">all_fingerprints</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
|
||||
|
||||
<span class="k">for</span> <span class="n">vote</span> <span class="ow">in</span> <span class="n">votes</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
||||
<span class="n">all_fingerprints</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">vote</span><span class="o">.</span><span class="n">routers</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
|
||||
|
||||
<span class="c"># Finally, compare moria1's votes to maatuska's votes.</span>
|
||||
|
||||
<span class="k">for</span> <span class="n">fingerprint</span> <span class="ow">in</span> <span class="n">all_fingerprints</span><span class="p">:</span>
|
||||
<span class="n">moria1_vote</span> <span class="o">=</span> <span class="n">votes</span><span class="p">[</span><span class="s">'moria1'</span><span class="p">]</span><span class="o">.</span><span class="n">routers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">fingerprint</span><span class="p">)</span>
|
||||
<span class="n">maatuska_vote</span> <span class="o">=</span> <span class="n">votes</span><span class="p">[</span><span class="s">'maatuska'</span><span class="p">]</span><span class="o">.</span><span class="n">routers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">fingerprint</span><span class="p">)</span>
|
||||
|
||||
<span class="k">if</span> <span class="ow">not</span> <span class="n">moria1_vote</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">maatuska_vote</span><span class="p">:</span>
|
||||
<span class="k">print</span><span class="p">(</span><span class="s">"both moria1 and maatuska haven't voted about </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">fingerprint</span><span class="p">)</span>
|
||||
<span class="k">elif</span> <span class="ow">not</span> <span class="n">moria1_vote</span><span class="p">:</span>
|
||||
<span class="k">print</span><span class="p">(</span><span class="s">"moria1 hasn't voted about </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">fingerprint</span><span class="p">)</span>
|
||||
<span class="k">elif</span> <span class="ow">not</span> <span class="n">maatuska_vote</span><span class="p">:</span>
|
||||
<span class="k">print</span><span class="p">(</span><span class="s">"maatuska hasn't voted about </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">fingerprint</span><span class="p">)</span>
|
||||
<span class="k">elif</span> <span class="s">'Running'</span> <span class="ow">in</span> <span class="n">moria1_vote</span><span class="o">.</span><span class="n">flags</span> <span class="ow">and</span> <span class="s">'Running'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">maatuska_vote</span><span class="o">.</span><span class="n">flags</span><span class="p">:</span>
|
||||
<span class="k">print</span><span class="p">(</span><span class="s">"moria1 has the Running flag but maatuska doesn't: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">fingerprint</span><span class="p">)</span>
|
||||
<span class="k">elif</span> <span class="s">'Running'</span> <span class="ow">in</span> <span class="n">maatuska_vote</span><span class="o">.</span><span class="n">flags</span> <span class="ow">and</span> <span class="s">'Running'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">moria1_vote</span><span class="o">.</span><span class="n">flags</span><span class="p">:</span>
|
||||
<span class="k">print</span><span class="p">(</span><span class="s">"maatuska has the Running flag but moria1 doesn't: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">fingerprint</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-python"><pre>% python compare_flags.py
|
||||
maatuska has the Running flag but moria1 doesn't: 92FCB6748A40E6088E22FBAB943AB2DD743EA818
|
||||
maatuska has the Running flag but moria1 doesn't: 6871F682350BA931838C0EC1E4A23044DAE06A73
|
||||
maatuska has the Running flag but moria1 doesn't: E2BB13AA2F6960CD93ABE5257A825687F3973C62
|
||||
moria1 has the Running flag but maatuska doesn't: 546C54E2A89D88E0794D04AECBF1AC8AC9DA81DE
|
||||
moria1 has the Running flag but maatuska doesn't: DCAEC3D069DC39AAE43D13C8AF31B5645E05ED61
|
||||
...</pre>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="bottomnav">
|
||||
</div>
|
||||
|
||||
<div class="footer">
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
250
docs/download_descriptor.html
Normal file
250
docs/download_descriptor.html
Normal file
@ -0,0 +1,250 @@
|
||||
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Download Tor Descriptors — Stem 1.8.1-maint documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="../../_static/haiku.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../../_static/style.css" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '../../',
|
||||
VERSION: '1.8.1-maint',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="../../_static/jquery.js"></script>
|
||||
<script type="text/javascript" src="../../_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="../../_static/doctools.js"></script>
|
||||
<link rel="shortcut icon" href="../../_static/favicon.png"/>
|
||||
<link rel="top" title="Stem 1.8.1-maint documentation" href="../../index.html" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="header"><img class="rightlogo" src="../../_static/logo.png" alt="Logo"/><h1 class="heading"><a href="../../index.html">
|
||||
<span>Stem Docs</span></a></h1>
|
||||
<h2 class="heading"><span>Download Tor Descriptors</span></h2>
|
||||
</div>
|
||||
<div class="topnav">
|
||||
|
||||
<p>
|
||||
|
||||
<ul id="navbar">
|
||||
<li><a href="../../index.html">Home</a></li>
|
||||
<li><a href="../../tutorials.html">Tutorials</a>
|
||||
<ul>
|
||||
<li><a href="../the_little_relay_that_could.html">Hello World</a></li>
|
||||
<li><a href="../to_russia_with_love.html">Client Usage</a></li>
|
||||
<li><a href="../tortoise_and_the_hare.html">Event Listening</a></li>
|
||||
<li><a href="../over_the_river.html">Hidden Services</a></li>
|
||||
<li><a href="../mirror_mirror_on_the_wall.html">Tor Descriptors</a></li>
|
||||
<li><a href="../east_of_the_sun.html">Utilities</a></li>
|
||||
<li><a href="../down_the_rabbit_hole.html">Interpreter</a></li>
|
||||
<li><a href="../double_double_toil_and_trouble.html">Examples</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="../../api.html">API</a>
|
||||
<ul>
|
||||
<li><a href="../../api/control.html">stem.control</a></li>
|
||||
<li><a href="../../api/connection.html">stem.connection</a></li>
|
||||
<li><a href="../../api/socket.html">stem.socket</a></li>
|
||||
<li><a href="../../api/process.html">stem.process</a></li>
|
||||
<li><a href="../../api/response.html">stem.response</a></li>
|
||||
<li><a href="../../api/exit_policy.html">stem.exit_policy</a></li>
|
||||
<li><a href="../../api/version.html">stem.version</a></li>
|
||||
<li><a href="../../api.html#descriptors">Descriptors</a></li>
|
||||
<li><a href="../../api.html#utilities">Utilities</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="https://trac.torproject.org/projects/tor/wiki/doc/stem">Development</a>
|
||||
<ul>
|
||||
<li><a href="../../faq.html">FAQ</a></li>
|
||||
<li><a href="../../change_log.html">Change Log</a></li>
|
||||
<li><a href="https://github.com/torproject/stem/issues/">Bug Tracker</a></li>
|
||||
<li><a href="https://jenkins.torproject.org/job/stem-tor-ci/">Jenkins</a></li>
|
||||
<li><a href="../../download.html">Download</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="../../faq.html#where-can-i-get-help">Contact</a>
|
||||
<ul>
|
||||
<li><a href="https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-dev">Email List</a></li>
|
||||
<li><a href="https://www.torproject.org/about/contact.html.en#irc">IRC</a></li>
|
||||
<li><a href="https://www.atagar.com/contact/">Author</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
<div class="content">
|
||||
|
||||
|
||||
<div class="section" id="download-tor-descriptors">
|
||||
<h1>Download Tor Descriptors<a class="headerlink" href="#download-tor-descriptors" title="Permalink to this headline">¶</a></h1>
|
||||
<a class="reference external image-reference" href="../double_double_toil_and_trouble.html"><img alt="../../_images/back.png" src="../../_images/back.png" /></a>
|
||||
<p>Tor relays provide a mirror for the tor relay descriptors it has cached.
|
||||
These are available from its ORPort using <a class="reference external" href="https://gitweb.torproject.org/torspec.git/tree/tor-spec.txt">Tor's wire protocol</a>, and optionally
|
||||
with http as well from a <a class="reference external" href="https://gitweb.torproject.org/torspec.git/tree/dir-spec.txt">DirPort</a>.</p>
|
||||
<div class="highlight-python"><div class="highlight"><pre><span class="sd">"""</span>
|
||||
<span class="sd">Simple script to dowload a descriptor from Tor's ORPort or DirPort.</span>
|
||||
<span class="sd">"""</span>
|
||||
|
||||
<span class="kn">import</span> <span class="nn">collections</span>
|
||||
<span class="kn">import</span> <span class="nn">getopt</span>
|
||||
<span class="kn">import</span> <span class="nn">sys</span>
|
||||
|
||||
<span class="kn">import</span> <span class="nn">stem</span>
|
||||
<span class="kn">import</span> <span class="nn">stem.descriptor.remote</span>
|
||||
<span class="kn">import</span> <span class="nn">stem.util.connection</span>
|
||||
<span class="kn">import</span> <span class="nn">stem.util.tor_tools</span>
|
||||
|
||||
<span class="c"># By default downloading moria1's server descriptor from itself.</span>
|
||||
|
||||
<span class="n">DEFAULT_ARGS</span> <span class="o">=</span> <span class="p">{</span>
|
||||
<span class="s">'descriptor_type'</span><span class="p">:</span> <span class="s">'server'</span><span class="p">,</span>
|
||||
<span class="s">'fingerprint'</span><span class="p">:</span> <span class="s">'9695DFC35FFEB861329B9F1AB04C46397020CE31'</span><span class="p">,</span>
|
||||
<span class="s">'download_from'</span><span class="p">:</span> <span class="n">stem</span><span class="o">.</span><span class="n">DirPort</span><span class="p">(</span><span class="s">'128.31.0.34'</span><span class="p">,</span> <span class="mi">9131</span><span class="p">),</span>
|
||||
<span class="s">'print_help'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
|
||||
<span class="p">}</span>
|
||||
|
||||
<span class="n">VALID_TYPES</span> <span class="o">=</span> <span class="p">(</span><span class="s">'server'</span><span class="p">,</span> <span class="s">'extrainfo'</span><span class="p">,</span> <span class="s">'consensus'</span><span class="p">)</span>
|
||||
|
||||
<span class="n">HELP_TEXT</span> <span class="o">=</span> <span class="s">"""</span><span class="se">\</span>
|
||||
<span class="s">Downloads a descriptor through Tor's ORPort or DirPort.</span>
|
||||
|
||||
<span class="s"> -t, --type TYPE descriptor type to download, options are:</span>
|
||||
<span class="s"> </span><span class="si">%s</span><span class="s"></span>
|
||||
<span class="s"> -f, --fingerprint FP relay to download the descriptor of</span>
|
||||
<span class="s"> --orport ADDRESS:PORT ORPort to download from</span>
|
||||
<span class="s"> --dirport ADDRESS:PORT DirPort to download from</span>
|
||||
<span class="s"> -h, --help presents this help</span>
|
||||
<span class="s">"""</span> <span class="o">%</span> <span class="s">', '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">VALID_TYPES</span><span class="p">)</span>
|
||||
|
||||
|
||||
<span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="n">argv</span><span class="p">):</span>
|
||||
<span class="sd">"""</span>
|
||||
<span class="sd"> Parses our arguments, providing a named tuple with their values.</span>
|
||||
|
||||
<span class="sd"> :param list argv: input arguments to be parsed</span>
|
||||
|
||||
<span class="sd"> :returns: a **named tuple** with our parsed arguments</span>
|
||||
|
||||
<span class="sd"> :raises: **ValueError** if we got an invalid argument</span>
|
||||
<span class="sd"> """</span>
|
||||
|
||||
<span class="n">args</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">DEFAULT_ARGS</span><span class="p">)</span>
|
||||
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="n">recognized_args</span><span class="p">,</span> <span class="n">unrecognized_args</span> <span class="o">=</span> <span class="n">getopt</span><span class="o">.</span><span class="n">getopt</span><span class="p">(</span><span class="n">argv</span><span class="p">,</span> <span class="s">'t:f:h'</span><span class="p">,</span> <span class="p">[</span><span class="s">'type='</span><span class="p">,</span> <span class="s">'fingerprint='</span><span class="p">,</span> <span class="s">'orport='</span><span class="p">,</span> <span class="s">'dirport='</span><span class="p">,</span> <span class="s">'help'</span><span class="p">])</span>
|
||||
|
||||
<span class="k">if</span> <span class="n">unrecognized_args</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="n">getopt</span><span class="o">.</span><span class="n">GetoptError</span><span class="p">(</span><span class="s">"'</span><span class="si">%s</span><span class="s">' aren't recognized arguments"</span> <span class="o">%</span> <span class="s">"', '"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">unrecognized_args</span><span class="p">))</span>
|
||||
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">'</span><span class="si">%s</span><span class="s"> (for usage provide --help)'</span> <span class="o">%</span> <span class="n">exc</span><span class="p">)</span>
|
||||
|
||||
<span class="k">for</span> <span class="n">opt</span><span class="p">,</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">recognized_args</span><span class="p">:</span>
|
||||
<span class="k">if</span> <span class="n">opt</span> <span class="ow">in</span> <span class="p">(</span><span class="s">'-t'</span><span class="p">,</span> <span class="s">'--type'</span><span class="p">):</span>
|
||||
<span class="k">if</span> <span class="n">arg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">VALID_TYPES</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">"'</span><span class="si">%s</span><span class="s">' isn't a recognized decriptor type, options are: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="s">', '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">VALID_TYPES</span><span class="p">)))</span>
|
||||
|
||||
<span class="n">args</span><span class="p">[</span><span class="s">'descriptor_type'</span><span class="p">]</span> <span class="o">=</span> <span class="n">arg</span>
|
||||
<span class="k">elif</span> <span class="n">opt</span> <span class="ow">in</span> <span class="p">(</span><span class="s">'-f'</span><span class="p">,</span> <span class="s">'--fingerprint'</span><span class="p">):</span>
|
||||
<span class="k">if</span> <span class="ow">not</span> <span class="n">stem</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">tor_tools</span><span class="o">.</span><span class="n">is_valid_fingerprint</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
||||
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">"'</span><span class="si">%s</span><span class="s">' isn't a relay fingerprint"</span> <span class="o">%</span> <span class="n">arg</span><span class="p">)</span>
|
||||
|
||||
<span class="n">args</span><span class="p">[</span><span class="s">'fingerprint'</span><span class="p">]</span> <span class="o">=</span> <span class="n">arg</span>
|
||||
<span class="k">elif</span> <span class="n">opt</span> <span class="ow">in</span> <span class="p">(</span><span class="s">'--orport'</span><span class="p">,</span> <span class="s">'--dirport'</span><span class="p">):</span>
|
||||
<span class="k">if</span> <span class="s">':'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">arg</span><span class="p">:</span>
|
||||
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">"'</span><span class="si">%s</span><span class="s">' should be of the form 'address:port'"</span> <span class="o">%</span> <span class="n">arg</span><span class="p">)</span>
|
||||
|
||||
<span class="n">address</span><span class="p">,</span> <span class="n">port</span> <span class="o">=</span> <span class="n">arg</span><span class="o">.</span><span class="n">rsplit</span><span class="p">(</span><span class="s">':'</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
||||
|
||||
<span class="k">if</span> <span class="ow">not</span> <span class="n">stem</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">is_valid_ipv4_address</span><span class="p">(</span><span class="n">address</span><span class="p">):</span>
|
||||
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">"'</span><span class="si">%s</span><span class="s">' isn't a valid IPv4 address"</span> <span class="o">%</span> <span class="n">address</span><span class="p">)</span>
|
||||
<span class="k">elif</span> <span class="ow">not</span> <span class="n">stem</span><span class="o">.</span><span class="n">util</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">is_valid_port</span><span class="p">(</span><span class="n">port</span><span class="p">):</span>
|
||||
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">"'</span><span class="si">%s</span><span class="s">' isn't a valid port number"</span> <span class="o">%</span> <span class="n">port</span><span class="p">)</span>
|
||||
|
||||
<span class="n">endpoint_class</span> <span class="o">=</span> <span class="n">stem</span><span class="o">.</span><span class="n">ORPort</span> <span class="k">if</span> <span class="n">opt</span> <span class="o">==</span> <span class="s">'--orport'</span> <span class="k">else</span> <span class="n">stem</span><span class="o">.</span><span class="n">DirPort</span>
|
||||
<span class="n">args</span><span class="p">[</span><span class="s">'download_from'</span><span class="p">]</span> <span class="o">=</span> <span class="n">endpoint_class</span><span class="p">(</span><span class="n">address</span><span class="p">,</span> <span class="n">port</span><span class="p">)</span>
|
||||
<span class="k">elif</span> <span class="n">opt</span> <span class="ow">in</span> <span class="p">(</span><span class="s">'-h'</span><span class="p">,</span> <span class="s">'--help'</span><span class="p">):</span>
|
||||
<span class="n">args</span><span class="p">[</span><span class="s">'print_help'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
|
||||
|
||||
<span class="c"># translates our args dict into a named tuple</span>
|
||||
|
||||
<span class="n">Args</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">namedtuple</span><span class="p">(</span><span class="s">'Args'</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
|
||||
<span class="k">return</span> <span class="n">Args</span><span class="p">(</span><span class="o">**</span><span class="n">args</span><span class="p">)</span>
|
||||
|
||||
|
||||
<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="n">args</span> <span class="o">=</span> <span class="n">parse</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
|
||||
<span class="k">except</span> <span class="ne">ValueError</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
|
||||
<span class="k">print</span><span class="p">(</span><span class="n">exc</span><span class="p">)</span>
|
||||
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
|
||||
|
||||
<span class="k">if</span> <span class="n">args</span><span class="o">.</span><span class="n">print_help</span><span class="p">:</span>
|
||||
<span class="k">print</span><span class="p">(</span><span class="n">HELP_TEXT</span><span class="p">)</span>
|
||||
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>
|
||||
|
||||
<span class="k">print</span><span class="p">(</span><span class="s">'Downloading </span><span class="si">%s</span><span class="s"> descriptor from </span><span class="si">%s</span><span class="s">:</span><span class="si">%s</span><span class="s">...</span><span class="se">\n</span><span class="s">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">descriptor_type</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">download_from</span><span class="o">.</span><span class="n">address</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">download_from</span><span class="o">.</span><span class="n">port</span><span class="p">))</span>
|
||||
<span class="n">desc</span> <span class="o">=</span> <span class="bp">None</span>
|
||||
|
||||
<span class="k">if</span> <span class="n">args</span><span class="o">.</span><span class="n">descriptor_type</span> <span class="ow">in</span> <span class="p">(</span><span class="s">'server'</span><span class="p">,</span> <span class="s">'extrainfo'</span><span class="p">):</span>
|
||||
<span class="k">if</span> <span class="n">args</span><span class="o">.</span><span class="n">descriptor_type</span> <span class="o">==</span> <span class="s">'server'</span><span class="p">:</span>
|
||||
<span class="n">download_func</span> <span class="o">=</span> <span class="n">stem</span><span class="o">.</span><span class="n">descriptor</span><span class="o">.</span><span class="n">remote</span><span class="o">.</span><span class="n">get_server_descriptors</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="n">download_func</span> <span class="o">=</span> <span class="n">stem</span><span class="o">.</span><span class="n">descriptor</span><span class="o">.</span><span class="n">remote</span><span class="o">.</span><span class="n">get_extrainfo_descriptors</span>
|
||||
|
||||
<span class="n">desc</span> <span class="o">=</span> <span class="n">download_func</span><span class="p">(</span>
|
||||
<span class="n">fingerprints</span> <span class="o">=</span> <span class="p">[</span><span class="n">args</span><span class="o">.</span><span class="n">fingerprint</span><span class="p">],</span>
|
||||
<span class="n">endpoints</span> <span class="o">=</span> <span class="p">[</span><span class="n">args</span><span class="o">.</span><span class="n">download_from</span><span class="p">],</span>
|
||||
<span class="p">)</span><span class="o">.</span><span class="n">run</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
|
||||
<span class="k">elif</span> <span class="n">args</span><span class="o">.</span><span class="n">descriptor_type</span> <span class="o">==</span> <span class="s">'consensus'</span><span class="p">:</span>
|
||||
<span class="k">for</span> <span class="n">consensus_desc</span> <span class="ow">in</span> <span class="n">stem</span><span class="o">.</span><span class="n">descriptor</span><span class="o">.</span><span class="n">remote</span><span class="o">.</span><span class="n">get_consensus</span><span class="p">(</span><span class="n">endpoints</span> <span class="o">=</span> <span class="p">[</span><span class="n">args</span><span class="o">.</span><span class="n">download_from</span><span class="p">]):</span>
|
||||
<span class="k">if</span> <span class="n">consensus_desc</span><span class="o">.</span><span class="n">fingerprint</span> <span class="o">==</span> <span class="n">args</span><span class="o">.</span><span class="n">fingerprint</span><span class="p">:</span>
|
||||
<span class="n">desc</span> <span class="o">=</span> <span class="n">consensus_desc</span>
|
||||
<span class="k">break</span>
|
||||
|
||||
<span class="k">if</span> <span class="ow">not</span> <span class="n">desc</span><span class="p">:</span>
|
||||
<span class="k">print</span><span class="p">(</span><span class="s">'Unable to find a descriptor for </span><span class="si">%s</span><span class="s"> in the consensus'</span> <span class="o">%</span> <span class="n">args</span><span class="o">.</span><span class="n">fingerprint</span><span class="p">)</span>
|
||||
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="k">print</span><span class="p">(</span><span class="s">"'</span><span class="si">%s</span><span class="s">' is not a recognized descriptor type, options are: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">descriptor_type</span><span class="p">,</span> <span class="s">', '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">VALID_TYPES</span><span class="p">)))</span>
|
||||
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
|
||||
|
||||
<span class="k">print</span><span class="p">(</span><span class="n">desc</span><span class="p">)</span>
|
||||
|
||||
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
|
||||
<span class="n">main</span><span class="p">()</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-python"><pre>% python download_descriptor.py --type consensus --dirport 128.31.0.34:9131
|
||||
Downloading consensus descriptor from 128.31.0.34:9131...
|
||||
|
||||
r moria1 lpXfw1/+uGEym58asExGOXAgzjE IpcU7dolas8+Q+oAzwgvZIWx7PA 2018-05-23 02:41:25 128.31.0.34 9101 9131
|
||||
s Authority Fast Running Stable V2Dir Valid
|
||||
v Tor 0.3.3.5-rc-dev
|
||||
pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
|
||||
w Bandwidth=20 Unmeasured=1
|
||||
p reject 1-65535</pre>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="bottomnav">
|
||||
</div>
|
||||
|
||||
<div class="footer">
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
165
docs/exit_used.html
Normal file
165
docs/exit_used.html
Normal file
@ -0,0 +1,165 @@
|
||||
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Determine The Exit You're Using — Stem 1.8.1-maint documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="../../_static/haiku.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../../_static/style.css" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '../../',
|
||||
VERSION: '1.8.1-maint',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="../../_static/jquery.js"></script>
|
||||
<script type="text/javascript" src="../../_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="../../_static/doctools.js"></script>
|
||||
<link rel="shortcut icon" href="../../_static/favicon.png"/>
|
||||
<link rel="top" title="Stem 1.8.1-maint documentation" href="../../index.html" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="header"><img class="rightlogo" src="../../_static/logo.png" alt="Logo"/><h1 class="heading"><a href="../../index.html">
|
||||
<span>Stem Docs</span></a></h1>
|
||||
<h2 class="heading"><span>Determine The Exit You're Using</span></h2>
|
||||
</div>
|
||||
<div class="topnav">
|
||||
|
||||
<p>
|
||||
|
||||
<ul id="navbar">
|
||||
<li><a href="../../index.html">Home</a></li>
|
||||
<li><a href="../../tutorials.html">Tutorials</a>
|
||||
<ul>
|
||||
<li><a href="../the_little_relay_that_could.html">Hello World</a></li>
|
||||
<li><a href="../to_russia_with_love.html">Client Usage</a></li>
|
||||
<li><a href="../tortoise_and_the_hare.html">Event Listening</a></li>
|
||||
<li><a href="../over_the_river.html">Hidden Services</a></li>
|
||||
<li><a href="../mirror_mirror_on_the_wall.html">Tor Descriptors</a></li>
|
||||
<li><a href="../east_of_the_sun.html">Utilities</a></li>
|
||||
<li><a href="../down_the_rabbit_hole.html">Interpreter</a></li>
|
||||
<li><a href="../double_double_toil_and_trouble.html">Examples</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="../../api.html">API</a>
|
||||
<ul>
|
||||
<li><a href="../../api/control.html">stem.control</a></li>
|
||||
<li><a href="../../api/connection.html">stem.connection</a></li>
|
||||
<li><a href="../../api/socket.html">stem.socket</a></li>
|
||||
<li><a href="../../api/process.html">stem.process</a></li>
|
||||
<li><a href="../../api/response.html">stem.response</a></li>
|
||||
<li><a href="../../api/exit_policy.html">stem.exit_policy</a></li>
|
||||
<li><a href="../../api/version.html">stem.version</a></li>
|
||||
<li><a href="../../api.html#descriptors">Descriptors</a></li>
|
||||
<li><a href="../../api.html#utilities">Utilities</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="https://trac.torproject.org/projects/tor/wiki/doc/stem">Development</a>
|
||||
<ul>
|
||||
<li><a href="../../faq.html">FAQ</a></li>
|
||||
<li><a href="../../change_log.html">Change Log</a></li>
|
||||
<li><a href="https://github.com/torproject/stem/issues/">Bug Tracker</a></li>
|
||||
<li><a href="https://jenkins.torproject.org/job/stem-tor-ci/">Jenkins</a></li>
|
||||
<li><a href="../../download.html">Download</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="../../faq.html#where-can-i-get-help">Contact</a>
|
||||
<ul>
|
||||
<li><a href="https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-dev">Email List</a></li>
|
||||
<li><a href="https://www.torproject.org/about/contact.html.en#irc">IRC</a></li>
|
||||
<li><a href="https://www.atagar.com/contact/">Author</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
<div class="content">
|
||||
|
||||
|
||||
<div class="section" id="determine-the-exit-you-re-using">
|
||||
<h1>Determine The Exit You're Using<a class="headerlink" href="#determine-the-exit-you-re-using" title="Permalink to this headline">¶</a></h1>
|
||||
<a class="reference external image-reference" href="../double_double_toil_and_trouble.html"><img alt="../../_images/back.png" src="../../_images/back.png" /></a>
|
||||
<p>Lets say you're using Tor and one day you run into something odd. Maybe a
|
||||
misconfigured relay, or maybe one that's being malicious. How can you figure
|
||||
out what exit you're using?</p>
|
||||
<p>Here's a simple script that prints information about the exits used to service
|
||||
the requests going through Tor...</p>
|
||||
<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">functools</span>
|
||||
|
||||
<span class="kn">from</span> <span class="nn">stem</span> <span class="kn">import</span> <span class="n">StreamStatus</span>
|
||||
<span class="kn">from</span> <span class="nn">stem.control</span> <span class="kn">import</span> <span class="n">EventType</span><span class="p">,</span> <span class="n">Controller</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
|
||||
<span class="k">print</span><span class="p">(</span><span class="s">"Tracking requests for tor exits. Press 'enter' to end."</span><span class="p">)</span>
|
||||
<span class="k">print</span><span class="p">(</span><span class="s">""</span><span class="p">)</span>
|
||||
|
||||
<span class="k">with</span> <span class="n">Controller</span><span class="o">.</span><span class="n">from_port</span><span class="p">()</span> <span class="k">as</span> <span class="n">controller</span><span class="p">:</span>
|
||||
<span class="n">controller</span><span class="o">.</span><span class="n">authenticate</span><span class="p">()</span>
|
||||
|
||||
<span class="n">stream_listener</span> <span class="o">=</span> <span class="n">functools</span><span class="o">.</span><span class="n">partial</span><span class="p">(</span><span class="n">stream_event</span><span class="p">,</span> <span class="n">controller</span><span class="p">)</span>
|
||||
<span class="n">controller</span><span class="o">.</span><span class="n">add_event_listener</span><span class="p">(</span><span class="n">stream_listener</span><span class="p">,</span> <span class="n">EventType</span><span class="o">.</span><span class="n">STREAM</span><span class="p">)</span>
|
||||
|
||||
<span class="nb">raw_input</span><span class="p">()</span> <span class="c"># wait for user to press enter</span>
|
||||
|
||||
|
||||
<span class="k">def</span> <span class="nf">stream_event</span><span class="p">(</span><span class="n">controller</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
|
||||
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="n">StreamStatus</span><span class="o">.</span><span class="n">SUCCEEDED</span> <span class="ow">and</span> <span class="n">event</span><span class="o">.</span><span class="n">circ_id</span><span class="p">:</span>
|
||||
<span class="n">circ</span> <span class="o">=</span> <span class="n">controller</span><span class="o">.</span><span class="n">get_circuit</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">circ_id</span><span class="p">)</span>
|
||||
|
||||
<span class="n">exit_fingerprint</span> <span class="o">=</span> <span class="n">circ</span><span class="o">.</span><span class="n">path</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
|
||||
<span class="n">exit_relay</span> <span class="o">=</span> <span class="n">controller</span><span class="o">.</span><span class="n">get_network_status</span><span class="p">(</span><span class="n">exit_fingerprint</span><span class="p">)</span>
|
||||
|
||||
<span class="k">print</span><span class="p">(</span><span class="s">"Exit relay for our connection to </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">target</span><span class="p">))</span>
|
||||
<span class="k">print</span><span class="p">(</span><span class="s">" address: </span><span class="si">%s</span><span class="s">:</span><span class="si">%i</span><span class="s">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">exit_relay</span><span class="o">.</span><span class="n">address</span><span class="p">,</span> <span class="n">exit_relay</span><span class="o">.</span><span class="n">or_port</span><span class="p">))</span>
|
||||
<span class="k">print</span><span class="p">(</span><span class="s">" fingerprint: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">exit_relay</span><span class="o">.</span><span class="n">fingerprint</span><span class="p">)</span>
|
||||
<span class="k">print</span><span class="p">(</span><span class="s">" nickname: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">exit_relay</span><span class="o">.</span><span class="n">nickname</span><span class="p">)</span>
|
||||
<span class="k">print</span><span class="p">(</span><span class="s">" locale: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">controller</span><span class="o">.</span><span class="n">get_info</span><span class="p">(</span><span class="s">"ip-to-country/</span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">exit_relay</span><span class="o">.</span><span class="n">address</span><span class="p">,</span> <span class="s">'unknown'</span><span class="p">))</span>
|
||||
<span class="k">print</span><span class="p">(</span><span class="s">""</span><span class="p">)</span>
|
||||
|
||||
|
||||
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
|
||||
<span class="n">main</span><span class="p">()</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Now if you make a request over Tor...</p>
|
||||
<div class="highlight-python"><pre>% curl --socks4a 127.0.0.1:9050 google.com
|
||||
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
|
||||
<TITLE>301 Moved</TITLE></HEAD><BODY>
|
||||
<H1>301 Moved</H1>
|
||||
The document has moved
|
||||
<A HREF="http://www.google.com/">here</A>.
|
||||
</BODY></HTML></pre>
|
||||
</div>
|
||||
<p>... this script will tell you about the exit...</p>
|
||||
<div class="highlight-python"><pre>% python exit_used.py
|
||||
Tracking requests for tor exits. Press 'enter' to end.
|
||||
|
||||
Exit relay for our connection to 64.15.112.44:80
|
||||
address: 31.172.30.2:443
|
||||
fingerprint: A59E1E7C7EAEE083D756EE1FF6EC31CA3D8651D7
|
||||
nickname: chaoscomputerclub19
|
||||
locale: unknown</pre>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="bottomnav">
|
||||
</div>
|
||||
|
||||
<div class="footer">
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
146
docs/list_circuits.html
Normal file
146
docs/list_circuits.html
Normal file
@ -0,0 +1,146 @@
|
||||
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>List Circuits — Stem 1.8.1-maint documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="../../_static/haiku.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../../_static/style.css" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '../../',
|
||||
VERSION: '1.8.1-maint',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="../../_static/jquery.js"></script>
|
||||
<script type="text/javascript" src="../../_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="../../_static/doctools.js"></script>
|
||||
<link rel="shortcut icon" href="../../_static/favicon.png"/>
|
||||
<link rel="top" title="Stem 1.8.1-maint documentation" href="../../index.html" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="header"><img class="rightlogo" src="../../_static/logo.png" alt="Logo"/><h1 class="heading"><a href="../../index.html">
|
||||
<span>Stem Docs</span></a></h1>
|
||||
<h2 class="heading"><span>List Circuits</span></h2>
|
||||
</div>
|
||||
<div class="topnav">
|
||||
|
||||
<p>
|
||||
|
||||
<ul id="navbar">
|
||||
<li><a href="../../index.html">Home</a></li>
|
||||
<li><a href="../../tutorials.html">Tutorials</a>
|
||||
<ul>
|
||||
<li><a href="../the_little_relay_that_could.html">Hello World</a></li>
|
||||
<li><a href="../to_russia_with_love.html">Client Usage</a></li>
|
||||
<li><a href="../tortoise_and_the_hare.html">Event Listening</a></li>
|
||||
<li><a href="../over_the_river.html">Hidden Services</a></li>
|
||||
<li><a href="../mirror_mirror_on_the_wall.html">Tor Descriptors</a></li>
|
||||
<li><a href="../east_of_the_sun.html">Utilities</a></li>
|
||||
<li><a href="../down_the_rabbit_hole.html">Interpreter</a></li>
|
||||
<li><a href="../double_double_toil_and_trouble.html">Examples</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="../../api.html">API</a>
|
||||
<ul>
|
||||
<li><a href="../../api/control.html">stem.control</a></li>
|
||||
<li><a href="../../api/connection.html">stem.connection</a></li>
|
||||
<li><a href="../../api/socket.html">stem.socket</a></li>
|
||||
<li><a href="../../api/process.html">stem.process</a></li>
|
||||
<li><a href="../../api/response.html">stem.response</a></li>
|
||||
<li><a href="../../api/exit_policy.html">stem.exit_policy</a></li>
|
||||
<li><a href="../../api/version.html">stem.version</a></li>
|
||||
<li><a href="../../api.html#descriptors">Descriptors</a></li>
|
||||
<li><a href="../../api.html#utilities">Utilities</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="https://trac.torproject.org/projects/tor/wiki/doc/stem">Development</a>
|
||||
<ul>
|
||||
<li><a href="../../faq.html">FAQ</a></li>
|
||||
<li><a href="../../change_log.html">Change Log</a></li>
|
||||
<li><a href="https://github.com/torproject/stem/issues/">Bug Tracker</a></li>
|
||||
<li><a href="https://jenkins.torproject.org/job/stem-tor-ci/">Jenkins</a></li>
|
||||
<li><a href="../../download.html">Download</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="../../faq.html#where-can-i-get-help">Contact</a>
|
||||
<ul>
|
||||
<li><a href="https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-dev">Email List</a></li>
|
||||
<li><a href="https://www.torproject.org/about/contact.html.en#irc">IRC</a></li>
|
||||
<li><a href="https://www.atagar.com/contact/">Author</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
<div class="content">
|
||||
|
||||
|
||||
<div class="section" id="list-circuits">
|
||||
<h1>List Circuits<a class="headerlink" href="#list-circuits" title="Permalink to this headline">¶</a></h1>
|
||||
<a class="reference external image-reference" href="../double_double_toil_and_trouble.html"><img alt="../../_images/back.png" src="../../_images/back.png" /></a>
|
||||
<p>Tor creates new circuits and tears down old ones on your behalf, so how can you
|
||||
get information about circuits Tor currently has available?</p>
|
||||
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">stem</span> <span class="kn">import</span> <span class="n">CircStatus</span>
|
||||
<span class="kn">from</span> <span class="nn">stem.control</span> <span class="kn">import</span> <span class="n">Controller</span>
|
||||
|
||||
<span class="k">with</span> <span class="n">Controller</span><span class="o">.</span><span class="n">from_port</span><span class="p">(</span><span class="n">port</span> <span class="o">=</span> <span class="mi">9051</span><span class="p">)</span> <span class="k">as</span> <span class="n">controller</span><span class="p">:</span>
|
||||
<span class="n">controller</span><span class="o">.</span><span class="n">authenticate</span><span class="p">()</span>
|
||||
|
||||
<span class="k">for</span> <span class="n">circ</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">controller</span><span class="o">.</span><span class="n">get_circuits</span><span class="p">()):</span>
|
||||
<span class="k">if</span> <span class="n">circ</span><span class="o">.</span><span class="n">status</span> <span class="o">!=</span> <span class="n">CircStatus</span><span class="o">.</span><span class="n">BUILT</span><span class="p">:</span>
|
||||
<span class="k">continue</span>
|
||||
|
||||
<span class="k">print</span><span class="p">(</span><span class="s">""</span><span class="p">)</span>
|
||||
<span class="k">print</span><span class="p">(</span><span class="s">"Circuit </span><span class="si">%s</span><span class="s"> (</span><span class="si">%s</span><span class="s">)"</span> <span class="o">%</span> <span class="p">(</span><span class="n">circ</span><span class="o">.</span><span class="n">id</span><span class="p">,</span> <span class="n">circ</span><span class="o">.</span><span class="n">purpose</span><span class="p">))</span>
|
||||
|
||||
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">entry</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">circ</span><span class="o">.</span><span class="n">path</span><span class="p">):</span>
|
||||
<span class="n">div</span> <span class="o">=</span> <span class="s">'+'</span> <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">circ</span><span class="o">.</span><span class="n">path</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="k">else</span> <span class="s">'|'</span>
|
||||
<span class="n">fingerprint</span><span class="p">,</span> <span class="n">nickname</span> <span class="o">=</span> <span class="n">entry</span>
|
||||
|
||||
<span class="n">desc</span> <span class="o">=</span> <span class="n">controller</span><span class="o">.</span><span class="n">get_network_status</span><span class="p">(</span><span class="n">fingerprint</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
|
||||
<span class="n">address</span> <span class="o">=</span> <span class="n">desc</span><span class="o">.</span><span class="n">address</span> <span class="k">if</span> <span class="n">desc</span> <span class="k">else</span> <span class="s">'unknown'</span>
|
||||
|
||||
<span class="k">print</span><span class="p">(</span><span class="s">" </span><span class="si">%s</span><span class="s">- </span><span class="si">%s</span><span class="s"> (</span><span class="si">%s</span><span class="s">, </span><span class="si">%s</span><span class="s">)"</span> <span class="o">%</span> <span class="p">(</span><span class="n">div</span><span class="p">,</span> <span class="n">fingerprint</span><span class="p">,</span> <span class="n">nickname</span><span class="p">,</span> <span class="n">address</span><span class="p">))</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-python"><pre>% python list_circuits.py
|
||||
|
||||
Circuit 4 (GENERAL)
|
||||
|- B1FA7D51B8B6F0CB585D944F450E7C06EDE7E44C (ByTORAndTheSnowDog, 173.209.180.61)
|
||||
|- 0DD9935C5E939CFA1E07B8DDA6D91C1A2A9D9338 (afo02, 87.238.194.176)
|
||||
+- DB3B1CFBD3E4D97B84B548ADD5B9A31451EEC4CC (edwardsnowden3, 109.163.234.10)
|
||||
|
||||
Circuit 6 (GENERAL)
|
||||
|- B1FA7D51B8B6F0CB585D944F450E7C06EDE7E44C (ByTORAndTheSnowDog, 173.209.180.61)
|
||||
|- EC01CB4766BADC1611678555CE793F2A7EB2D723 (sprockets, 46.165.197.96)
|
||||
+- 9EA317EECA56BDF30CAEB208A253FB456EDAB1A0 (bolobolo1, 96.47.226.20)
|
||||
|
||||
Circuit 10 (GENERAL)
|
||||
|- B1FA7D51B8B6F0CB585D944F450E7C06EDE7E44C (ByTORAndTheSnowDog, 173.209.180.61)
|
||||
|- 00C2C2A16AEDB51D5E5FB7D6168FC66B343D822F (ph3x, 86.59.119.83)
|
||||
+- 65242C91BFF30F165DA4D132C81A9EBA94B71D62 (torexit16, 176.67.169.171)</pre>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="bottomnav">
|
||||
</div>
|
||||
|
||||
<div class="footer">
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
139
docs/outdated_relays.html
Normal file
139
docs/outdated_relays.html
Normal file
@ -0,0 +1,139 @@
|
||||
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>List Outdated Relays — Stem 1.8.1-maint documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="../../_static/haiku.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../../_static/style.css" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '../../',
|
||||
VERSION: '1.8.1-maint',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="../../_static/jquery.js"></script>
|
||||
<script type="text/javascript" src="../../_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="../../_static/doctools.js"></script>
|
||||
<link rel="shortcut icon" href="../../_static/favicon.png"/>
|
||||
<link rel="top" title="Stem 1.8.1-maint documentation" href="../../index.html" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="header"><img class="rightlogo" src="../../_static/logo.png" alt="Logo"/><h1 class="heading"><a href="../../index.html">
|
||||
<span>Stem Docs</span></a></h1>
|
||||
<h2 class="heading"><span>List Outdated Relays</span></h2>
|
||||
</div>
|
||||
<div class="topnav">
|
||||
|
||||
<p>
|
||||
|
||||
<ul id="navbar">
|
||||
<li><a href="../../index.html">Home</a></li>
|
||||
<li><a href="../../tutorials.html">Tutorials</a>
|
||||
<ul>
|
||||
<li><a href="../the_little_relay_that_could.html">Hello World</a></li>
|
||||
<li><a href="../to_russia_with_love.html">Client Usage</a></li>
|
||||
<li><a href="../tortoise_and_the_hare.html">Event Listening</a></li>
|
||||
<li><a href="../over_the_river.html">Hidden Services</a></li>
|
||||
<li><a href="../mirror_mirror_on_the_wall.html">Tor Descriptors</a></li>
|
||||
<li><a href="../east_of_the_sun.html">Utilities</a></li>
|
||||
<li><a href="../down_the_rabbit_hole.html">Interpreter</a></li>
|
||||
<li><a href="../double_double_toil_and_trouble.html">Examples</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="../../api.html">API</a>
|
||||
<ul>
|
||||
<li><a href="../../api/control.html">stem.control</a></li>
|
||||
<li><a href="../../api/connection.html">stem.connection</a></li>
|
||||
<li><a href="../../api/socket.html">stem.socket</a></li>
|
||||
<li><a href="../../api/process.html">stem.process</a></li>
|
||||
<li><a href="../../api/response.html">stem.response</a></li>
|
||||
<li><a href="../../api/exit_policy.html">stem.exit_policy</a></li>
|
||||
<li><a href="../../api/version.html">stem.version</a></li>
|
||||
<li><a href="../../api.html#descriptors">Descriptors</a></li>
|
||||
<li><a href="../../api.html#utilities">Utilities</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="https://trac.torproject.org/projects/tor/wiki/doc/stem">Development</a>
|
||||
<ul>
|
||||
<li><a href="../../faq.html">FAQ</a></li>
|
||||
<li><a href="../../change_log.html">Change Log</a></li>
|
||||
<li><a href="https://github.com/torproject/stem/issues/">Bug Tracker</a></li>
|
||||
<li><a href="https://jenkins.torproject.org/job/stem-tor-ci/">Jenkins</a></li>
|
||||
<li><a href="../../download.html">Download</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="../../faq.html#where-can-i-get-help">Contact</a>
|
||||
<ul>
|
||||
<li><a href="https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-dev">Email List</a></li>
|
||||
<li><a href="https://www.torproject.org/about/contact.html.en#irc">IRC</a></li>
|
||||
<li><a href="https://www.atagar.com/contact/">Author</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
<div class="content">
|
||||
|
||||
|
||||
<div class="section" id="list-outdated-relays">
|
||||
<h1>List Outdated Relays<a class="headerlink" href="#list-outdated-relays" title="Permalink to this headline">¶</a></h1>
|
||||
<a class="reference external image-reference" href="../double_double_toil_and_trouble.html"><img alt="../../_images/back.png" src="../../_images/back.png" /></a>
|
||||
<p>Time marches on. Tor makes new releases, and at some point needs to drop
|
||||
support for old ones. Below is the script we used on <a class="reference external" href="https://trac.torproject.org/9476">ticket 9476</a> to reach out
|
||||
to relay operators that needed to upgrade.</p>
|
||||
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">stem.descriptor.remote</span> <span class="kn">import</span> <span class="n">DescriptorDownloader</span>
|
||||
<span class="kn">from</span> <span class="nn">stem.version</span> <span class="kn">import</span> <span class="n">Version</span>
|
||||
|
||||
<span class="n">downloader</span> <span class="o">=</span> <span class="n">DescriptorDownloader</span><span class="p">()</span>
|
||||
<span class="n">count</span><span class="p">,</span> <span class="n">with_contact</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span>
|
||||
|
||||
<span class="k">print</span><span class="p">(</span><span class="s">"Checking for outdated relays..."</span><span class="p">)</span>
|
||||
<span class="k">print</span><span class="p">(</span><span class="s">""</span><span class="p">)</span>
|
||||
|
||||
<span class="k">for</span> <span class="n">desc</span> <span class="ow">in</span> <span class="n">downloader</span><span class="o">.</span><span class="n">get_server_descriptors</span><span class="p">():</span>
|
||||
<span class="k">if</span> <span class="n">desc</span><span class="o">.</span><span class="n">tor_version</span> <span class="o"><</span> <span class="n">Version</span><span class="p">(</span><span class="s">'0.2.3.0'</span><span class="p">):</span>
|
||||
<span class="n">count</span> <span class="o">+=</span> <span class="mi">1</span>
|
||||
|
||||
<span class="k">if</span> <span class="n">desc</span><span class="o">.</span><span class="n">contact</span><span class="p">:</span>
|
||||
<span class="k">print</span><span class="p">(</span><span class="s">' </span><span class="si">%-15s</span><span class="s"> </span><span class="si">%s</span><span class="s">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">desc</span><span class="o">.</span><span class="n">tor_version</span><span class="p">,</span> <span class="n">desc</span><span class="o">.</span><span class="n">contact</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s">"utf-8"</span><span class="p">,</span> <span class="s">"replace"</span><span class="p">)))</span>
|
||||
<span class="n">with_contact</span> <span class="o">+=</span> <span class="mi">1</span>
|
||||
|
||||
<span class="k">print</span><span class="p">(</span><span class="s">""</span><span class="p">)</span>
|
||||
<span class="k">print</span><span class="p">(</span><span class="s">"</span><span class="si">%i</span><span class="s"> outdated relays found, </span><span class="si">%i</span><span class="s"> had contact information"</span> <span class="o">%</span> <span class="p">(</span><span class="n">count</span><span class="p">,</span> <span class="n">with_contact</span><span class="p">))</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-python"><pre>% python outdated_relays.py
|
||||
Checking for outdated relays...
|
||||
|
||||
0.2.2.39 Random Person admin@gtr-10.de
|
||||
0.2.2.36 dobrovich_psckaal at vietrievus dot ok
|
||||
0.2.2.39 anonymous6 anonymous@mailinator.com
|
||||
0.2.2.39 anonymous12 anonymous@mailinator.com
|
||||
...
|
||||
|
||||
316 outdated relays found, 120 had contact information</pre>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="bottomnav">
|
||||
</div>
|
||||
|
||||
<div class="footer">
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
362
docs/over_the_river.html
Normal file
362
docs/over_the_river.html
Normal file