tor-commits
Threads by month
- ----- 2025 -----
- July
- June
- 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
March 2019
- 20 participants
- 3265 discussions
commit 39d4fc94b04bf59baf18da83af6f5ec948a8e064
Author: Damian Johnson <atagar(a)torproject.org>
Date: Thu Mar 7 12:13:35 2019 -0800
Add anarcat to the people page
---
about/en/corepeople.wml | 178 ++++++++++++++++++++++++----------------------
images/people/anarcat.png | Bin 0 -> 25682 bytes
2 files changed, 94 insertions(+), 84 deletions(-)
diff --git a/about/en/corepeople.wml b/about/en/corepeople.wml
index 5f8634e1..c1e5d0b1 100644
--- a/about/en/corepeople.wml
+++ b/about/en/corepeople.wml
@@ -82,13 +82,23 @@
<tr>
<td>
+ <a id="anarcat"></a>
+ <div class="photo"><img src="$(IMGROOT)/people/anarcat.png" alt="anarcat" /></div>
+ <div class="name"><a href="#anarcat">anarcat</a></div>
+ <div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/he">he</a></div>
+ <div class="description">Is making things work.</div>
+ </td>
+
+ <td>
<a id="andreas"></a>
<div class="photo"><img src="$(IMGROOT)/people/no_photo.png" alt="no photo" /></div>
<div class="icon"><a href="../keys/andreas.txt"><img src="$(IMGROOT)/pgp-key.png" alt="pgp key" /></a></div>
<div class="name"><a href="#andreas">Andreas Lehner</a></div>
<div class="description">Works at the intersection of security, privacy, data integrity and anonymity both in politics and technology.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="antonela"></a>
<div class="photo"><img src="$(IMGROOT)/people/antonela.png" alt="antonela" /></div>
@@ -98,9 +108,7 @@
<div class="field"><b>IRC:</b> antonela</div>
<div class="description">Designer working with the UX team. Making Tor usable for everyone.</div>
</td>
- </tr>
- <tr>
<td>
<a id="arlolra"></a>
<div class="photo"><img src="$(IMGROOT)/people/arlolra.png" alt="arlolra" /></div>
@@ -110,7 +118,9 @@
<div class="field"><b>IRC:</b> arlolra</div>
<div class="description">Developer for Snowflake, Tor Messenger, and Check.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="arthuredelstein"></a>
<div class="photo"><img src="$(IMGROOT)/people/arthuredelstein.png" alt="arthuredelstein" /></div>
@@ -119,9 +129,7 @@
<div class="field"><b>IRC:</b> arthuredelstein</div>
<div class="description">Works on Tor Browser.</div>
</td>
- </tr>
- <tr>
<td>
<a id="hellais"></a>
<div class="photo"><img src="$(IMGROOT)/people/hellais.png" alt="hellais" /></div>
@@ -131,7 +139,9 @@
<div class="field"><b>IRC:</b> hellais</div>
<div class="description">Project leader for <a href="https://ooni.torproject.org/">OONI</a>, has helped with <a href="http://tor2web.org/">tor2web</a>, wrote Atlas which later became <a href="https://metrics.torproject.org/rs.html">Relay Search</a>, and helps improve security.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="bdavila"></a>
<div class="photo"><img src="$(IMGROOT)/people/bdavila.png" alt="bdavila" /></div>
@@ -140,9 +150,7 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/she">she</a></div>
<div class="description">Grants Manager.</div>
</td>
- </tr>
- <tr>
<td>
<a id="brade"></a>
<div class="photo"><img src="$(IMGROOT)/people/no_photo.png" alt="no photo" /></div>
@@ -151,7 +159,9 @@
<div class="field"><b>IRC:</b> brade</div>
<div class="description">Developer on the Tor Browser team.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="cohosh"></a>
<div class="photo"><img src="$(IMGROOT)/people/no_photo.png" alt="no photo" /></div>
@@ -160,9 +170,7 @@
<div class="field"><b>IRC:</b> cohosh</div>
<div class="description">Developer on the anti-censorship team. Works on pluggable transport development and integration, and BridgeDB.</div>
</td>
- </tr>
- <tr>
<td>
<a id="komlo"></a>
<div class="photo"><img src="$(IMGROOT)/people/komlo.png" alt="komlo" /></div>
@@ -172,7 +180,9 @@
<div class="field"><b>IRC:</b> komlo</div>
<div class="description">Chelsea is a software/security engineer and contributes to core tor.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="cindy"></a>
<div class="photo"><img src="$(IMGROOT)/people/cindy.png" alt="cindy" /></div>
@@ -181,9 +191,7 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/she">she</a></div>
<div class="description">Tor Board member and <a href="https://www.eff.org/about/staff/cindy-cohn">Executive Director of the EFF</a>. Lawyer by training, <a href="https://blog.torproject.org/blog/tor-heart-notes-board-member">her focus</a> is on making sure Tor stays available and that Tor users stay safe.</div>
</td>
- </tr>
- <tr>
<td>
<a id="Phoul"></a>
<div class="photo"><img src="$(IMGROOT)/people/phoul.png" alt="phoul" /></div>
@@ -193,7 +201,9 @@
<div class="field"><b>IRC:</b> Phoul</div>
<div class="description">Relay advocate, Outreachy mentor, and a member of the community team. He is also a director of the Canadian Torservers.net partner <a href="https://www.coldhak.ca/">Coldhak</a>.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="atagar"></a>
<div class="photo"><img src="$(IMGROOT)/people/atagar.png" alt="atagar" /></div>
@@ -203,9 +213,7 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/he">he</a></div>
<div class="description">Author of the <a href="https://stem.torproject.org/">Stem</a> python controller library and <a href="https://nyx.torproject.org/">Nyx</a> relay monitor.</div>
</td>
- </tr>
- <tr>
<td>
<a id="dgoulet"></a>
<div class="photo"><img src="$(IMGROOT)/people/dgoulet.png" alt="dgoulet" /></div>
@@ -214,7 +222,9 @@
<div class="field"><b>IRC:</b> dgoulet</div>
<div class="description">Tor development team focusing on onion services and our torsocks maintainer.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="dawuud"></a>
<div class="photo"><img src="$(IMGROOT)/people/dawuud.png" alt="dawuud" /></div>
@@ -224,9 +234,7 @@
<div class="field"><b>IRC:</b> dawuud</div>
<div class="description"><a href="https://github.com/david415/">Author of roflcoptor and honeybadger</a>. Researches mixnets and contributes to txtorcon.</div>
</td>
- </tr>
- <tr>
<td>
<a id="DonnchaC"></a>
<div class="photo"><img src="$(IMGROOT)/people/donnchac.png" alt="donnchac" /></div>
@@ -236,7 +244,9 @@
<div class="field"><b>IRC:</b> DonnchaC</div>
<div class="description">Onion services developer, OnionBalance developer, hunter of bad relays.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="emmapeel"></a>
<div class="photo"><img src="$(IMGROOT)/people/emmapeel.png" alt="emmapeel" /></div>
@@ -246,9 +256,7 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/she">she</a></div>
<div class="description">emmapeel coordinates the localization (translations) of the different Tor software.</div>
</td>
- </tr>
- <tr>
<td>
<a id="ewyatt"></a>
<div class="photo"><img src="$(IMGROOT)/people/ewyatt.png" alt="ewyatt" /></div>
@@ -257,7 +265,9 @@
<div class="field"><b>IRC:</b> ewyatt</div>
<div class="description">Non-technical switchboard for people-related things: recruiting, onboarding, benefits, contracts, TPI policy questions, and baked goods.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="gaba"></a>
<div class="photo"><img src="$(IMGROOT)/people/gaba.png" alt="gaba" /></div>
@@ -267,9 +277,7 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/she">she</a></div>
<div class="description">Coordinates Network, Metrics and Anti-censorship teams.</div>
</td>
- </tr>
- <tr>
<td>
<a id="biella"></a>
<div class="photo"><img src="$(IMGROOT)/people/biella.png" alt="biella" /></div>
@@ -279,7 +287,9 @@
<div class="field"><b>IRC:</b> biella</div>
<div class="description"><a href="http://gabriellacoleman.org/">Anthropologist</a> and Wolfe Chair in Scientific and Technological Literacy at McGill University.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="gman999"></a>
<div class="photo"><img src="$(IMGROOT)/people/no_photo.png" alt="no photo" /></div>
@@ -287,9 +297,7 @@
<div class="field"><b>IRC:</b> gman999</div>
<div class="description">Tor BSD Diversity Project member, long-time relay operator, trainer.</div>
</td>
- </tr>
- <tr>
<td>
<a id="GeKo"></a>
<div class="photo"><img src="$(IMGROOT)/people/no_photo.png" alt="no photo" /></div>
@@ -298,7 +306,9 @@
<div class="field"><b>IRC:</b> GeKo</div>
<div class="description">Currently lead of the Tor Browser team.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="asn"></a>
<div class="photo"><img src="$(IMGROOT)/people/asn.png" alt="asn" /></div>
@@ -307,9 +317,7 @@
<div class="field"><b>IRC:</b> asn</div>
<div class="description">Onion services. Security analysis. Used to obfsproxy. Follower of the onion.</div>
</td>
- </tr>
- <tr>
<td>
<a id="saint"></a>
<div class="photo"><img src="$(IMGROOT)/people/saint.png" alt="saint" /></div>
@@ -319,7 +327,9 @@
<div class="field"><b>IRC:</b> saint</div>
<div class="description">Tamper-resistant software distribution, censorship detection, <a href="https://github.com/glamrock/cupcake">Cupcake</a>, and security training of activists and domestic violence survivors.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="ggus"></a>
<div class="photo"><img src="$(IMGROOT)/people/no_photo.png" alt="no photo" /></div>
@@ -328,9 +338,7 @@
<div class="field"><b>IRC:</b> ggus</div>
<div class="description">Works as Community Liaison in Global South. Trainer, relay operator and Tor advocate. CryptoRave organizer.</div>
</td>
- </tr>
- <tr>
<td>
<a id="hc"></a>
<div class="photo"><img src="$(IMGROOT)/people/hc.png" alt="hc" /></div>
@@ -340,7 +348,9 @@
<div class="field"><b>IRC:</b> _hc</div>
<div class="description">Works on Orbot, NetCipher, and integrating Tor everywhere possible, especially in Debian and Android. Also deeply mixed into Guardian Project.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="irl"></a>
<div class="photo"><img src="$(IMGROOT)/people/irl.png" alt="irl" /></div>
@@ -351,9 +361,7 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/he">he</a></div>
<div class="description"><a href="https://metrics.torproject.org">Metrics team member</a> and maintainer of <a href="https://metrics.torproject.org/rs.html">Relay Search</a>.</div>
</td>
- </tr>
- <tr>
<td>
<a id="ian"></a>
<div class="photo"><img src="$(IMGROOT)/people/ian.png" alt="ian" /></div>
@@ -362,7 +370,9 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/he">he</a></div>
<div class="description"><a href="https://cs.uwaterloo.ca/~iang/">Professor of CS</a> at the <a href="https://uwaterloo.ca/">University of Waterloo</a>, developing <a href="https://otr.cypherpunks.ca/">Off-the-Record Messaging</a> among other things.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="igt0"></a>
<div class="photo"><img src="$(IMGROOT)/people/no_photo.png" alt="no photo" /></div>
@@ -372,9 +382,7 @@
<div class="field"><b>IRC:</b> igt0</div>
<div class="description">Works on Tor Browser.</div>
</td>
- </tr>
- <tr>
<td>
<a id="intrigeri"></a>
<div class="photo"><img src="$(IMGROOT)/people/no_photo.png" alt="no photo" /></div>
@@ -383,7 +391,9 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/he">he</a></div>
<div class="description">He is one of our main interfaces with the <a href="https://tails.boum.org/">Tails</a> project.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="isabela"></a>
<div class="photo"><img src="$(IMGROOT)/people/isabela.png" alt="isabela" /></div>
@@ -393,9 +403,7 @@
<div class="field"><b>IRC:</b> isabela</div>
<div class="description">Executive Director of the Tor Project.</div>
</td>
- </tr>
- <tr>
<td>
<a id="ilv"></a>
<div class="photo"><img src="$(IMGROOT)/people/no_photo.png" alt="no photo" /></div>
@@ -403,7 +411,9 @@
<div class="name"><a href="#ilv">isra</a></div>
<div class="description">Rewrote the <a href="https://gettor.torproject.org">GetTor</a> service.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="redshiftzero"></a>
<div class="photo"><img src="$(IMGROOT)/people/redshiftzero.png" alt="redshiftzero" /></div>
@@ -413,9 +423,7 @@
<div class="field"><b>IRC:</b> redshiftzero</div>
<div class="description">Lead developer of the <a href="https://securedrop.org/">SecureDrop</a> whistleblower platform based at the <a href="https://freedom.press/">Freedom of the Press Foundation</a>.</div>
</td>
- </tr>
- <tr>
<td>
<a id="qbi"></a>
<div class="photo"><img src="$(IMGROOT)/people/no_photo.png" alt="no photo" /></div>
@@ -425,7 +433,9 @@
<div class="field"><b>IRC:</b> qbi</div>
<div class="description">Volunteer that helped translate the website, is part of TorServers.net, and Tor's sysadmin team.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="jselon"></a>
<div class="photo"><img src="$(IMGROOT)/people/jselon.png" alt="jselon" /></div>
@@ -434,9 +444,7 @@
<div class="field"><b>IRC:</b> jselon</div>
<div class="description">Event Coordination, donor management, general office operations.</div>
</td>
- </tr>
- <tr>
<td>
<a id="juga"></a>
<div class="photo"><img src="$(IMGROOT)/people/juga.png" alt="juga" /></div>
@@ -445,7 +453,9 @@
<div class="field"><b>IRC:</b> juga</div>
<div class="description">Contributed to OONI, bug tracker features, wrote tordyguards. Currently working on bandwidth scanner.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="julius"></a>
<div class="photo"><img src="$(IMGROOT)/people/no_photo.png" alt="no photo" /></div>
@@ -454,9 +464,7 @@
<div class="name"><a href="#julius">Julius Mittenzwei</a></div>
<div class="description">Germany-based lawyer and Internet activist.</div>
</td>
- </tr>
- <tr>
<td>
<a id="juris"></a>
<div class="photo"><img src="$(IMGROOT)/people/no_photo.png" alt="no photo" /></div>
@@ -465,7 +473,9 @@
<div class="field"><b>IRC:</b> juris</div>
<div class="description">Board member of torservers.net.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="karsten"></a>
<div class="photo"><img src="$(IMGROOT)/people/karsten.png" alt="karsten" /></div>
@@ -475,9 +485,7 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/he">he</a></div>
<div class="description">Primary researcher and developer into <a href="https://metrics.torproject.org/">anonymous metrics</a> which started as a National Science Foundation grant.</div>
</td>
- </tr>
- <tr>
<td>
<a id="kat5"></a>
<div class="photo"><img src="$(IMGROOT)/people/kat5.png" alt="kat5" /></div>
@@ -487,7 +495,9 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/she">she</a></div>
<div class="description">Volunteer on the Community Team. Helps with t-shirts for relay operators and other odds and ends.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="ailanthus"></a>
<div class="photo"><img src="$(IMGROOT)/people/ailanthus.png" alt="ailanthus" /></div>
@@ -497,9 +507,7 @@
<div class="field"><b>IRC:</b> ailanthus</div>
<div class="description">Writes about Tor in mainstream and technical publications and conducts community workshops to teach people about Tor.</div>
</td>
- </tr>
- <tr>
<td>
<a id="kushal"></a>
<div class="photo"><img src="$(IMGROOT)/people/kushal.png" alt="kushal" /></div>
@@ -510,16 +518,16 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/he">he</a></div>
<div class="description"><a href="https://securedrop.org">SecureDrop</a> developer at the <a href="https://freedom.press">Freedom of Press Foundation</a>. Member of the community team, privacy advocate focusing on new users.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="leif"></a>
<div class="photo"><img src="$(IMGROOT)/people/no_photo.png" alt="no photo" /></div>
<div class="name"><a href="#leif">Leif Ryge</a></div>
<div class="description">Works on security analysis, designer of "bananaphone" transport.</div>
</td>
- </tr>
- <tr>
<td>
<a id="ln5"></a>
<div class="photo"><img src="$(IMGROOT)/people/ln5.png" alt="ln5" /></div>
@@ -529,7 +537,9 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/he">he</a></div>
<div class="description">Software developer, sysadmin and co-founder of the Swedish Torservers.net partner :DFRI. Member of the sysadmin team. Runs one of the directory authorities.</a></div>
</td>
+ </tr>
+ <tr>
<td>
<a id="wayward"></a>
<div class="photo"><img src="$(IMGROOT)/people/wayward.png" alt="wayward" /></div>
@@ -539,9 +549,7 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/she">she</a></div>
<div class="description">Community team, user advocate, and Mozilla fellow.</div>
</td>
- </tr>
- <tr>
<td>
<a id="agrabeli"></a>
<div class="photo"><img src="$(IMGROOT)/people/agrabeli.png" alt="agrabeli" /></div>
@@ -552,7 +560,9 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/she">she</a></div>
<div class="description">Maria manages OONI's Partnership Program and writes research reports on internet censorship around the world.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="mcs"></a>
<div class="photo"><img src="$(IMGROOT)/people/mcs.png" alt="mcs" /></div>
@@ -562,9 +572,7 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/he">he</a></div>
<div class="description">Developer on the Tor Browser team.</div>
</td>
- </tr>
- <tr>
<td>
<a id="matt"></a>
<div class="photo"><img src="$(IMGROOT)/people/no_photo.png" alt="no photo" /></div>
@@ -572,7 +580,9 @@
<div class="name"><a href="#matt">Matt Blaze</a></div>
<div class="description">Chairs the Tor Board of Directors. Professor at the University of Pennsylvania where he researches security, privacy, and anonymity.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="pastly"></a>
<div class="photo"><img src="$(IMGROOT)/people/pastly.png" alt="pastly" /></div>
@@ -581,9 +591,7 @@
<div class="field"><b>IRC:</b> pastly</div>
<div class="description">Matt <a href="http://mattttttssi4lhud.onion/">implemented</a> the <a href="http://www.robgjansen.com/publications/kist-sec2014.pdf">KIST scheduler</a> into Tor. He helps safely measure Tor and says helpful things on IRC.</div>
</td>
- </tr>
- <tr>
<td>
<a id="sysrqb"></a>
<div class="photo"><img src="$(IMGROOT)/people/no_photo.png" alt="no photo" /></div>
@@ -593,7 +601,9 @@
<div class="field"><b>IRC:</b> sysrqb</div>
<div class="description">Works on tor, torsocks, and many other projects. Helps maintain and develop BridgeDB.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="meejah"></a>
<div class="photo"><img src="$(IMGROOT)/people/meejah.png" alt="meejah" /></div>
@@ -603,9 +613,7 @@
<div class="field"><b>IRC:</b> meejah</div>
<div class="description"><a href="https://meejah.ca">Author</a> of <a href="https://github.com/meejah/txtorcon">txtorcon</a>, <a href="https://github.com/meejah/carml">carml</a> and other Tor Python tools including some for bad-relay hunting.</div>
</td>
- </tr>
- <tr>
<td>
<a id="micahflee"></a>
<div class="photo"><img src="$(IMGROOT)/people/micahflee.png" alt="micahflee" /></div>
@@ -614,7 +622,9 @@
<div class="name"><a href="#micahflee">Micah Lee</a></div>
<div class="description">Developer of <a href="https://github.com/micahflee/onionshare">OnionShare</a> and <a href="https://github.com/micahflee/torbrowser-launcher">Tor Browser Launcher</a> journalist and security engineer at <a href="https://theintercept.com/staff/micah-lee/">The Intercept</a> and advocate for <a href="https://freedom.press/">freedom of the press</a>.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="mtigas"></a>
<div class="photo"><img src="$(IMGROOT)/people/mtigas.png" alt="mtigas" /></div>
@@ -624,9 +634,7 @@
<div class="field"><b>IRC:</b> mtigas</div>
<div class="description">Works on <a href="https://mike.tig.as/onionbrowser/">Onion Browser</a>, iOS, and hacker-journalist at <a href="https://www.propublica.org/">ProPublica</a> running their <a href="https://www.propub3r6espa33w.onion/">onion service</a>.</div>
</td>
- </tr>
- <tr>
<td>
<a id="moritz"></a>
<div class="photo"><img src="$(IMGROOT)/people/moritz.png" alt="moritz" /></div>
@@ -635,7 +643,9 @@
<div class="name"><a href="#moritz">Moritz Bartl</a></div>
<div class="description">Co-founder of <a href="https://www.torservers.net/">torservers.net</a>, a network of non-profit organizations that run Tor exit relays.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="n8fr8"></a>
<div class="photo"><img src="$(IMGROOT)/people/n8fr8.png" alt="n8fr8" /></div>
@@ -644,9 +654,7 @@
<div class="field"><b>IRC:</b> n8fr8</div>
<div class="description">Founder of the <a href="https://guardianproject.info/">Guardian Project</a>. Orbot lead developer and contributor to Orfox, Onion Browser and NetCipher SDK. Director of Technology at Tibet Action Institute.</div>
</td>
- </tr>
- <tr>
<td>
<a id="nickhopper"></a>
<div class="photo"><img src="$(IMGROOT)/people/nickhopper.png" alt="nickhopper" /></div>
@@ -655,7 +663,9 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/he">he</a></div>
<div class="description"><a href="https://www-users.cs.umn.edu/~hopper/">Researcher</a> interested in improving Tor's performance and resistance to traffic analysis. Some of my work is described <a href="https://www-users.cs.umn.edu/~hopper/research.html">here</a>.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="nickm"></a>
<div class="photo"><img src="$(IMGROOT)/people/nickm.png" alt="nickm" /></div>
@@ -666,9 +676,7 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/he">he</a></div>
<div class="description">One of the three original designers of Tor - does a lot of the ongoing design work, and coordinates and leads ongoing development.</div>
</td>
- </tr>
- <tr>
<td>
<a id="boklm"></a>
<div class="photo"><img src="$(IMGROOT)/people/no_photo.png" alt="no photo" /></div>
@@ -678,7 +686,9 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/he">he</a></div>
<div class="description">Works on Tor Browser.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="mrphs"></a>
<div class="photo"><img src="$(IMGROOT)/people/no_photo.png" alt="no photo" /></div>
@@ -688,9 +698,7 @@
<div class="field"><b>IRC:</b> mrphs</div>
<div class="description">His main area of interests are End-users Accessibility/Security, UX, Censorship, Advocacy and Onion Services.</div>
</td>
- </tr>
- <tr>
<td>
<a id="pari"></a>
<div class="photo"><img src="$(IMGROOT)/people/pari.png" alt="pari" /></div>
@@ -700,7 +708,9 @@
<div class="field"><b>IRC:</b> pari</div>
<div class="description">Works with UX and Community teams, and on Tor India initiatives. Started as an Outreachy intern.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="syverson"></a>
<div class="photo"><img src="$(IMGROOT)/people/syverson.png" alt="syverson" /></div>
@@ -708,9 +718,7 @@
<div class="field"><b>IRC:</b> syverson</div>
<div class="description"><a href="https://www.nrl.navy.mil">NRL</a> researcher on most things Tor. Inventor of <a href="https://www.onion-router.net/">onion routing</a>, and one of the three original designers of Tor.</div>
</td>
- </tr>
- <tr>
<td>
<a id="pepijn"></a>
<div class="photo"><img src="$(IMGROOT)/people/pepijn.png" alt="pepijn" /></div>
@@ -719,16 +727,16 @@
<div class="name"><a href="#pepijn">Pepijn Le Heux</a></div>
<div class="description">Lawyer based in The Netherlands and co-founder of Hart voor Internetvrijheid.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="peter"></a>
<div class="photo"><img src="$(IMGROOT)/people/no_photo.png" alt="no photo" /></div>
<div class="name"><a href="#peter">Peter Palfrader</a></div>
<div class="description">Manages the Debian packages, runs one of the directory authorities, and generally helps out a lot.</div>
</td>
- </tr>
- <tr>
<td>
<a id="phw"></a>
<div class="photo"><img src="$(IMGROOT)/people/no_photo.png" alt="no photo" /></div>
@@ -738,7 +746,9 @@
<div class="field"><b>IRC:</b> phw</div>
<div class="description">Maintains <a href="https://gitweb.torproject.org/user/phw/exitmap.git/">exitmap</a> and <a href="https://gitweb.torproject.org/user/phw/sybilhunter.git/">sybilhunter</a>, works on <a href="https://trac.torproject.org/projects/tor/wiki/doc/ReportingBadRelays">bad relay detection</a>, and does <a href="https://nymity.ch/papers.html">security and privacy research</a>.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="pili"></a>
<div class="photo"><img src="$(IMGROOT)/people/pili.png" alt="pili" /></div>
@@ -749,9 +759,7 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/she">she</a></div>
<div class="description">Project Manager for the Tor Browser, Community and UX teams.</div>
</td>
- </tr>
- <tr>
<td>
<a id="robt"></a>
<div class="photo"><img src="$(IMGROOT)/people/robt.png" alt="robt" /></div>
@@ -759,7 +767,9 @@
<div class="name"><a href="#robt">Rabbi Rob Thomas</a></div>
<div class="description">CEO of Team Cymru, which supports Tor through hosting, research, and infosec assistance.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="ramy"></a>
<div class="photo"><img src="$(IMGROOT)/people/ramy.png" alt="ramy" /></div>
@@ -768,9 +778,7 @@
<div class="name"><a href="#ramy">Ramy Raoof</a></div>
<div class="description">Tor Board member, technologist, and privacy and security researcher.</div>
</td>
- </tr>
- <tr>
<td>
<a id="pospeselr"></a>
<div class="photo"><img src="$(IMGROOT)/people/no_photo.png" alt="no photo" /></div>
@@ -780,7 +788,9 @@
<div class="field"><b>IRC:</b> pospeselr</div>
<div class="description">Tor Browser developer.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="robgjansen"></a>
<div class="photo"><img src="$(IMGROOT)/people/robgjansen.png" alt="robgjansen" /></div>
@@ -790,9 +800,7 @@
<div class="field"><b>IRC:</b> robgjansen</div>
<div class="description"><a href="https://www.nrl.navy.mil">NRL</a> research scientist, <a href="http://www.robgjansen.com/">leading expert in Tor network performance</a>, and author of <a href="https://shadow.github.io/">Shadow</a>.</div>
</td>
- </tr>
- <tr>
<td>
<a id="arma"></a>
<div class="photo"><img src="$(IMGROOT)/people/arma.png" alt="arma" /></div>
@@ -802,7 +810,9 @@
<div class="field"><b>IRC:</b> arma</div>
<div class="description">Original developer of Tor along with Nick and Paul. Leading privacy researcher, coordinating developers and researchers.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="sajolida"></a>
<div class="photo"><img src="$(IMGROOT)/people/sajolida.png" alt="sajolida" /></div>
@@ -811,9 +821,7 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/he">he</a></div>
<div class="description">Technical writing, UX, and fundraising for Tails.</div>
</td>
- </tr>
- <tr>
<td>
<a id="sstevenson"></a>
<div class="photo"><img src="$(IMGROOT)/people/sstevenson.png" alt="sstevenson" /></div>
@@ -821,7 +829,9 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/she">she</a></div>
<div class="description">Directs and coordinates all fundraising activities.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="sebastian"></a>
<div class="photo"><img src="$(IMGROOT)/people/no_photo.png" alt="no photo" /></div>
@@ -829,9 +839,7 @@
<div class="name"><a href="#sebastian">Sebastian Hahn</a></div>
<div class="description">Helps people around the world use and understand Tor better. Generally helps everything run smoothly. Runs one of the directory authorities.</div>
</td>
- </tr>
- <tr>
<td>
<a id="sisbell"></a>
<div class="photo"><img src="$(IMGROOT)/people/no_photo.png" alt="no photo" /></div>
@@ -841,7 +849,9 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/he">he</a></div>
<div class="description">Works on Tor Browser for Android.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="ssteele"></a>
<div class="photo"><img src="$(IMGROOT)/people/ssteele.png" alt="ssteele" /></div>
@@ -852,9 +862,7 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/she">she</a></div>
<div class="description">Shari Steele is on the board of directors for the Tor Project.</div>
</td>
- </tr>
- <tr>
<td>
<a id="hiro"></a>
<div class="photo"><img src="$(IMGROOT)/people/hiro.png" alt="hiro" /></div>
@@ -864,7 +872,9 @@
<div class="field"><b>IRC:</b> hiro</div>
<div class="description">Hiro builds and runs Tor Project's web applications and services.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="inf0"></a>
<div class="photo"><img src="$(IMGROOT)/people/inf0.png" alt="inf0" /></div>
@@ -874,9 +884,7 @@
<div class="field"><b>IRC:</b> inf0</div>
<div class="description">Directory authority operator, outreach and trains human rights activists. System's Engineer at Team Cymru and co-Founder of accessnow.org.</div>
</td>
- </tr>
- <tr>
<td>
<a id="stephw"></a>
<div class="photo"><img src="$(IMGROOT)/people/stephw.png" alt="stephw" /></div>
@@ -887,7 +895,9 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/she">she</a></div>
<div class="description">Directs communications.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="sjmurdoch"></a>
<div class="photo"><img src="$(IMGROOT)/people/sjmurdoch.png" alt="sjmurdoch" /></div>
@@ -897,9 +907,7 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/he">he</a></div>
<div class="description"><a href=""http://murdoch.is/"">Principal Research Fellow</a> at University College London. He is the original creator of the <a href=""https://www.torproject.org/projects/torbrowser.html.en"">Tor Browser</a>.</div>
</td>
- </tr>
- <tr>
<td>
<a id="sukhe"></a>
<div class="photo"><img src="$(IMGROOT)/people/no_photo.png" alt="no photo" /></div>
@@ -908,7 +916,9 @@
<div class="field"><b>IRC:</b> sukhe</div>
<div class="description"><a href="https://trac.torproject.org/projects/tor/wiki/torbirdy">TorBirdy</a> and <a href="https://trac.torproject.org/projects/tor/wiki/doc/TorMessenger">Tor Messenger</a> developer. Member of the <a href="https://trac.torproject.org/projects/tor/wiki/org/teams/CommunityTeam">Community Team</a>.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="haxxpop"></a>
<div class="photo"><img src="$(IMGROOT)/people/haxxpop.png" alt="haxxpop" /></div>
@@ -918,9 +928,7 @@
<div class="field"><b>IRC:</b> haxxpop</div>
<div class="description">Contributes to core Tor and especially onion services.</div>
</td>
- </tr>
- <tr>
<td>
<a id="catalyst"></a>
<div class="photo"><img src="$(IMGROOT)/people/no_photo.png" alt="no photo" /></div>
@@ -931,7 +939,9 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/they/them">they</a></div>
<div class="description">Software archaeologist and keeper of C language arcana. Works with applied cryptography, protocol design, software security, and technical debt restructuring.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="teor"></a>
<div class="photo"><img src="$(IMGROOT)/people/no_photo.png" alt="no photo" /></div>
@@ -941,9 +951,7 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/they/them">they</a></div>
<div class="description">Tor developer and chutney maintainer. Currently working on onion services, directory documents, and statistics.</div>
</td>
- </tr>
- <tr>
<td>
<a id="tjr"></a>
<div class="photo"><img src="$(IMGROOT)/people/tjr.png" alt="tjr" /></div>
@@ -954,7 +962,9 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/he">he</a></div>
<div class="description">Maintains <a href="https://consensus-health.torproject.org/">Consensus Health </a>, runs one of the bandwidth authorities, and contributes to Tor Browser.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="egypcio"></a>
<div class="photo"><img src="$(IMGROOT)/people/egypcio.png" alt="egypcio" /></div>
@@ -964,9 +974,7 @@
<div class="field"><b>IRC:</b> egypcio</div>
<div class="description">TorBSD Diversity Project (TDP); IPv6 Enthusiast, BSD Systems Evangelist, and Bridges/Relays Operator.</div>
</td>
- </tr>
- <tr>
<td>
<a id="wseltzer"></a>
<div class="photo"><img src="$(IMGROOT)/people/wseltzer.png" alt="wseltzer" /></div>
@@ -977,7 +985,9 @@
<div class="field"><b>Pronoun:</b> <a href="http://pronoun.is/she">she</a></div>
<div class="description"><a href="https://wendy.seltzer.org/">Techie lawyer</a> and former Tor board member. She works on legal and policy support for private and secure communications.</div>
</td>
+ </tr>
+ <tr>
<td>
<a id="yawning"></a>
<div class="photo"><img src="$(IMGROOT)/people/no_photo.png" alt="no photo" /></div>
diff --git a/images/people/anarcat.png b/images/people/anarcat.png
new file mode 100644
index 00000000..05ad4bc4
Binary files /dev/null and b/images/people/anarcat.png differ
1
0

07 Mar '19
commit 88f282c7334f9ee76dccbf9b84dc7bcf0b39cd5b
Author: David Fifield <david(a)bamsoftware.com>
Date: Thu Mar 7 11:01:29 2019 -0700
Link to the snowbox test environment.
---
README.md | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/README.md b/README.md
index 130cee2..f5807a2 100644
--- a/README.md
+++ b/README.md
@@ -21,6 +21,7 @@ Pluggable Transport using WebRTC, inspired by Flashproxy.
- [Dependencies](#dependencies)
- [More Info](#more-info)
- [Building](#building)
+ - [Test Environment](#test-environment)
- [FAQ](#faq)
- [Appendix](#appendix)
- [-- Testing Copy-Paste Via Browser Proxy --](#---testing-copy-paste-via-browser-proxy---)
@@ -103,6 +104,12 @@ Then, open a browser tab to `http://127.0.0.1:8000/snowflake.html` to view
the debug-console of the snowflake.,
So long as that tab is open, you are an ephemeral Tor bridge.
+
+#### Test Environment
+
+There is a Docker-based test environment at https://github.com/cohosh/snowbox.
+
+
### FAQ
**Q: How does it work?**
1
0
commit bd26d565e8b7e1f637054a75d6bc786f709fff19
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Thu Mar 7 10:50:27 2019 -0500
Bump to 1.5.3
---
lib/trunnel/__init__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/trunnel/__init__.py b/lib/trunnel/__init__.py
index cd65cf5..e628cc6 100644
--- a/lib/trunnel/__init__.py
+++ b/lib/trunnel/__init__.py
@@ -3,4 +3,4 @@
# a package.
#
-__version__ = "1.5.2"
+__version__ = "1.5.3"
1
0

07 Mar '19
commit 8b5a4b94476a74865f11d4149ce617f7dd0dd308
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Thu Mar 7 10:49:30 2019 -0500
Uplift an openbsd patch from Kris Katterjohn
---
lib/trunnel/data/trunnel.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/lib/trunnel/data/trunnel.c b/lib/trunnel/data/trunnel.c
index 39258eb..b4abbbe 100644
--- a/lib/trunnel/data/trunnel.c
+++ b/lib/trunnel/data/trunnel.c
@@ -10,6 +10,10 @@
#include <stdlib.h>
#include <string.h>
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+
#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \
__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
# define IS_LITTLE_ENDIAN 1
@@ -27,7 +31,7 @@
# define IS_LITTLE_ENDIAN
# endif
#else
-# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
+# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(OpenBSD)
# include <sys/endian.h>
# else
# include <endian.h>
1
0
commit bd55facaa71bfb306715e7b47caa1db70ab7f54a
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Thu Mar 7 10:40:04 2019 -0500
update trunel copyright dates
---
lib/trunnel/data/trunnel-impl.h | 2 +-
lib/trunnel/data/trunnel.c | 2 +-
lib/trunnel/data/trunnel.h | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/lib/trunnel/data/trunnel-impl.h b/lib/trunnel/data/trunnel-impl.h
index 418764d..35c62df 100644
--- a/lib/trunnel/data/trunnel-impl.h
+++ b/lib/trunnel/data/trunnel-impl.h
@@ -1,7 +1,7 @@
/* trunnel-impl.h -- Implementation helpers for trunnel, included by
* generated trunnel files
*
- * Copyright 2014-2017, The Tor Project, Inc.
+ * Copyright 2014-2019, The Tor Project, Inc.
* See license at the end of this file for copying information.
*/
diff --git a/lib/trunnel/data/trunnel.c b/lib/trunnel/data/trunnel.c
index c59b47b..39258eb 100644
--- a/lib/trunnel/data/trunnel.c
+++ b/lib/trunnel/data/trunnel.c
@@ -1,6 +1,6 @@
/* trunnel.c -- Helper functions to implement trunnel.
*
- * Copyright 2014-2017, The Tor Project, Inc.
+ * Copyright 2014-2019, The Tor Project, Inc.
* See license at the end of this file for copying information.
*
* See trunnel-impl.h for documentation of these functions.
diff --git a/lib/trunnel/data/trunnel.h b/lib/trunnel/data/trunnel.h
index c79657b..c4057db 100644
--- a/lib/trunnel/data/trunnel.h
+++ b/lib/trunnel/data/trunnel.h
@@ -1,7 +1,7 @@
/* trunnel.h -- Public declarations for trunnel, to be included
* in trunnel header files.
- * Copyright 2014-2017, The Tor Project, Inc.
+ * Copyright 2014-2019, The Tor Project, Inc.
* See license at the end of this file for copying information.
*/
1
0

07 Mar '19
commit e4c4622a8e443a36480dacae3eee18d55a55a7ac
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Thu Mar 7 09:34:00 2019 -0500
Bug 22402: Improve "For assistance" link.
Instead of pointing users to the Tor Project contact page, point them
to support.torproject.org/#connectingtotor.
---
src/chrome/content/network-settings.js | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/src/chrome/content/network-settings.js b/src/chrome/content/network-settings.js
index 1599c28..ef7571e 100644
--- a/src/chrome/content/network-settings.js
+++ b/src/chrome/content/network-settings.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, The Tor Project, Inc.
+// Copyright (c) 2019, The Tor Project, Inc.
// See LICENSE for licensing information.
//
// vim: set sw=2 sts=2 ts=8 et syntax=javascript:
@@ -35,9 +35,7 @@ const kPrefBridgeDBType = "extensions.torlauncher.bridgedb_bridge_type";
// extensions.torlauncher.bridgedb_bridge.1, and so on.
const kPrefBranchBridgeDBBridge = "extensions.torlauncher.bridgedb_bridge.";
-// As of April 2016, no one is responding to help desk email. Hopefully this will change soon.
-//const kSupportAddr = "help(a)rt.torproject.org";
-const kSupportURL = "torproject.org/about/contact.html#support";
+const kSupportURL = "support.torproject.org/#connectingtotor";
const kTorProcessReadyTopic = "TorProcessIsReady";
const kTorProcessExitedTopic = "TorProcessExited";
1
0
commit 829863f48fb4e624f849df4c67bc970331014b0d
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Thu Jan 24 10:08:02 2019 +0100
Run modules from Java only.
Implements #29166.
---
build.xml | 136 +--------------------
.../web/images => R/rserver}/no-data-available.pdf | Bin
.../web/images => R/rserver}/no-data-available.png | Bin
.../web/images => R/rserver}/no-data-available.xcf | Bin
src/main/R/rserver/rserve-init.R | 6 +-
.../torproject/metrics/stats/advbwdist/Main.java | 15 ++-
.../metrics/stats/bwhist/Configuration.java | 18 ---
.../org/torproject/metrics/stats/bwhist/Main.java | 31 +++--
.../torproject/metrics/stats/clients/Database.java | 10 +-
.../torproject/metrics/stats/clients/Detector.java | 7 +-
.../org/torproject/metrics/stats/clients/Main.java | 37 +++---
.../metrics/stats/collectdescs/Main.java | 5 +-
.../metrics/stats/connbidirect/Main.java | 15 ++-
.../org/torproject/metrics/stats/hidserv/Main.java | 14 ++-
.../org/torproject/metrics/stats/main/Main.java | 122 ++++++++++++++++++
.../torproject/metrics/stats/onionperf/Main.java | 26 ++--
.../metrics/stats/servers/Configuration.java | 18 ---
.../torproject/metrics/stats/servers/Database.java | 10 +-
.../org/torproject/metrics/stats/servers/Main.java | 45 +++----
.../metrics/stats/totalcw/Configuration.java | 18 ---
.../torproject/metrics/stats/totalcw/Database.java | 10 +-
.../org/torproject/metrics/stats/totalcw/Main.java | 29 +++--
.../torproject/metrics/stats/webstats/Main.java | 23 ++--
23 files changed, 296 insertions(+), 299 deletions(-)
diff --git a/build.xml b/build.xml
index 42965bf..254a71f 100644
--- a/build.xml
+++ b/build.xml
@@ -18,7 +18,8 @@
<property name="name" value="metrics-web"/>
<property name="project-main-class"
- value="org.torproject.TBD" />
+ value="org.torproject.metrics.stats.main.Main" />
+ <property name="jarincludes" value="logback.xml" />
<property name="additional2sign" value="${warfile}" />
<property name="tardepends" value="war" />
@@ -26,11 +27,6 @@
<property name="specdir" value="${basedir}/generated/spec" />
- <!-- Deployment base folder.
- Be aware that this is also set in R scripts and web.xml, currently! -->
- <property name="metrics-web.deployment.base"
- value="/srv/metrics.torproject.org/metrics" />
-
<!-- The coverage needs to be improved! -->
<target name="coverage-check">
<cobertura-check totallinerate="0" totalbranchrate="0" >
@@ -301,85 +297,6 @@
<delete file="${specdir}/${specfile}.tmp2" quiet="true" />
</target>
- <!-- This can be adapted to point at the actual work directory. -->
- <property name="prepare.deployment"
- value="/srv/metrics.torproject.org/metrics/work" />
-
- <!-- Don't alter the following. -->
- <property name="modulebase" value="${prepare.deployment}/modules" />
-
- <!-- Operational tasks. -->
- <target name="run-web-prepare" depends="init" >
- <mkdir dir="${prepare.deployment}/modules" />
- <antcall target="collectdescs" />
- <antcall target="connbidirect" />
- <antcall target="onionperf" />
- <antcall target="bwhist" />
- <antcall target="advbwdist" />
- <antcall target="hidserv" />
- <antcall target="clients" />
- <antcall target="servers" />
- <antcall target="webstats" />
- <antcall target="totalcw" />
- <antcall target="make-data-available" />
- </target>
-
- <target name="collectdescs" >
- <property name="module.name" value="collectdescs" />
- <antcall target="run-java" />
- </target>
-
- <target name="connbidirect" >
- <property name="module.name" value="connbidirect" />
- <antcall target="run-java" />
- </target>
-
- <target name="onionperf" >
- <property name="module.name" value="onionperf" />
- <antcall target="run-java" />
- </target>
-
- <target name="bwhist" >
- <property name="module.name" value="bwhist" />
- <antcall target="run-java" />
- </target>
-
- <target name="advbwdist">
- <property name="module.name" value="advbwdist" />
- <antcall target="run-java" />
- </target>
-
- <target name="hidserv" >
- <property name="module.name" value="hidserv" />
- <antcall target="run-java" />
- </target>
-
- <target name="clients" >
- <property name="module.name" value="clients" />
- <antcall target="run-java" />
- </target>
-
- <target name="servers" >
- <property name="module.name" value="servers" />
- <antcall target="run-java" >
- <param name="module.main"
- value="org.torproject.metrics.stats.servers.Main" />
- </antcall>
- </target>
-
- <target name="webstats" >
- <property name="module.name" value="webstats" />
- <antcall target="run-java" />
- </target>
-
- <target name="totalcw" >
- <property name="module.name" value="totalcw" />
- <antcall target="run-java" >
- <param name="module.main"
- value="org.torproject.metrics.stats.totalcw.Main" />
- </antcall>
- </target>
-
<!--
The run-rserver target documents a working option of
configuring an R server for running metrics-web.
@@ -401,55 +318,6 @@
</exec>
</target>
- <target name="make-data-available" >
- <property name="statsdir" value="${metrics-web.deployment.base}/shared/stats/" />
- <mkdir dir="${statsdir}" />
- <property name="rdatadir" value="${metrics-web.deployment.base}/shared/RData" />
- <mkdir dir="${rdatadir}" />
- <copy todir="${statsdir}" >
- <fileset dir="${modulebase}/onionperf/stats" includes="*.csv" />
- <fileset dir="${modulebase}/connbidirect/stats" includes="connbidirect2.csv" />
- <fileset dir="${modulebase}/advbwdist/stats" includes="advbwdist.csv" />
- <fileset dir="${modulebase}/bwhist/stats" includes="*.csv" />
- <fileset dir="${modulebase}/hidserv/stats" includes="hidserv.csv" />
- <fileset dir="${modulebase}/clients/stats"
- includes="clients*.csv userstats-combined.csv" />
- <fileset dir="${modulebase}/servers/stats" includes="*.csv" />
- <fileset dir="${modulebase}/webstats/stats" includes="webstats.csv" />
- <fileset dir="${modulebase}/totalcw/stats" includes="totalcw.csv" />
- </copy>
- <copy todir="${rdatadir}" >
- <fileset dir="${resources}/web/images/" includes="no-data-available.*" />
- </copy>
- </target>
-
- <!-- Support tasks for operation -->
- <target name="run-java">
- <echo message="Running java module ${module.name} ... " />
- <available file="${dist}/${jarfile}" property="have.jar"/>
- <fail unless="have.jar" message="Please run 'ant jar' first."/>
- <condition property="mainclass"
- value="${module.main}"
- else="org.torproject.metrics.stats.${module.name}.Main" >
- <isset property="module.main"/>
- </condition>
- <property name="workingdir" value="${modulebase}/${module.name}" />
- <mkdir dir="${workingdir}" />
- <java dir="${workingdir}"
- fork="true"
- maxmemory="4g"
- classname="${mainclass}">
- <classpath>
- <pathelement location="${dist}/${jarfile}"/>
- <pathelement location="${resources}"/>
- </classpath>
- <jvmarg value="-DLOGBASE=../logs"/>
- <jvmarg value="-Duser.language=us" />
- <jvmarg value="-Duser.region=US" />
- </java>
- <echo message="Java module ${module.name} finished. " />
- </target>
-
<!-- The following line adds the common targets and properties
for Metrics' Java Projects.
-->
diff --git a/src/main/resources/web/images/no-data-available.pdf b/src/main/R/rserver/no-data-available.pdf
similarity index 100%
rename from src/main/resources/web/images/no-data-available.pdf
rename to src/main/R/rserver/no-data-available.pdf
diff --git a/src/main/resources/web/images/no-data-available.png b/src/main/R/rserver/no-data-available.png
similarity index 100%
rename from src/main/resources/web/images/no-data-available.png
rename to src/main/R/rserver/no-data-available.png
diff --git a/src/main/resources/web/images/no-data-available.xcf b/src/main/R/rserver/no-data-available.xcf
similarity index 100%
rename from src/main/resources/web/images/no-data-available.xcf
rename to src/main/R/rserver/no-data-available.xcf
diff --git a/src/main/R/rserver/rserve-init.R b/src/main/R/rserver/rserve-init.R
index c412e4c..5a47550 100644
--- a/src/main/R/rserver/rserve-init.R
+++ b/src/main/R/rserver/rserve-init.R
@@ -333,7 +333,7 @@ copyright_notice <- "The Tor Project - https://metrics.torproject.org/"
stats_dir <- "/srv/metrics.torproject.org/metrics/shared/stats/"
-rdata_dir <- "/srv/metrics.torproject.org/metrics/shared/RData/"
+no_data_available_dir <- "/srv/metrics.torproject.org/metrics/src/main/R/rserver/"
# Helper function that copies the appropriate no data object to filename.
copy_no_data <- function(filename) {
@@ -342,8 +342,8 @@ copy_no_data <- function(filename) {
if (".csv" == extension) {
write("# No data available for the given parameters.", file=filename)
} else {
- file.copy(paste(rdata_dir, "no-data-available", extension, sep = ""),
- filename)
+ file.copy(paste(no_data_available_dir, "no-data-available", extension,
+ sep = ""), filename)
}
}
diff --git a/src/main/java/org/torproject/metrics/stats/advbwdist/Main.java b/src/main/java/org/torproject/metrics/stats/advbwdist/Main.java
index 6c4f4ac..3afcb80 100644
--- a/src/main/java/org/torproject/metrics/stats/advbwdist/Main.java
+++ b/src/main/java/org/torproject/metrics/stats/advbwdist/Main.java
@@ -32,6 +32,9 @@ import java.util.TreeMap;
public class Main {
+ private static final File baseDir = new File(
+ org.torproject.metrics.stats.main.Main.modulesDir, "advbwdist");
+
/** Executes this data-processing module. */
public static void main(String[] args) throws IOException {
@@ -41,7 +44,8 @@ public class Main {
DescriptorReader descriptorReader =
DescriptorSourceFactory.createDescriptorReader();
for (Descriptor descriptor : descriptorReader.readDescriptors(new File(
- "../../shared/in/recent/relay-descriptors/server-descriptors"))) {
+ org.torproject.metrics.stats.main.Main.descriptorsDir,
+ "recent/relay-descriptors/server-descriptors"))) {
if (!(descriptor instanceof ServerDescriptor)) {
continue;
}
@@ -56,9 +60,9 @@ public class Main {
/* Parse consensuses, keeping a parse history. */
descriptorReader = DescriptorSourceFactory.createDescriptorReader();
- File historyFile = new File("status/parsed-consensuses");
+ File historyFile = new File(baseDir, "status/parsed-consensuses");
descriptorReader.setHistoryFile(historyFile);
- File resultsFile = new File("stats/advbwdist-validafter.csv");
+ File resultsFile = new File(baseDir, "stats/advbwdist-validafter.csv");
resultsFile.getParentFile().mkdirs();
boolean writeHeader = !resultsFile.exists();
BufferedWriter bw = new BufferedWriter(new FileWriter(resultsFile,
@@ -70,7 +74,8 @@ public class Main {
"yyyy-MM-dd HH:mm:ss");
dateTimeFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
for (Descriptor descriptor : descriptorReader.readDescriptors(new File(
- "../../shared/in/recent/relay-descriptors/consensuses"))) {
+ org.torproject.metrics.stats.main.Main.descriptorsDir,
+ "recent/relay-descriptors/consensuses"))) {
if (!(descriptor instanceof RelayNetworkStatusConsensus)) {
continue;
}
@@ -165,7 +170,7 @@ public class Main {
preAggregatedValues.get(keyWithoutTime).add(value);
}
}
- File aggregateResultsFile = new File("stats/advbwdist.csv");
+ File aggregateResultsFile = new File(baseDir, "stats/advbwdist.csv");
aggregateResultsFile.getParentFile().mkdirs();
try (BufferedWriter bw2 = new BufferedWriter(
new FileWriter(aggregateResultsFile))) {
diff --git a/src/main/java/org/torproject/metrics/stats/bwhist/Configuration.java b/src/main/java/org/torproject/metrics/stats/bwhist/Configuration.java
deleted file mode 100644
index 2a0fbc5..0000000
--- a/src/main/java/org/torproject/metrics/stats/bwhist/Configuration.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Copyright 2011--2018 The Tor Project
- * See LICENSE for licensing information */
-
-package org.torproject.metrics.stats.bwhist;
-
-/** Configuration options parsed from Java properties with reasonable hard-coded
- * defaults. */
-public class Configuration {
- static String descriptors = System.getProperty("bwhist.descriptors",
- "../../shared/in/");
- static String database = System.getProperty("bwhist.database",
- "jdbc:postgresql:tordir");
- static String history = System.getProperty("bwhist.history",
- "status/read-descriptors");
- static String output = System.getProperty("bwhist.output",
- "stats/");
-}
-
diff --git a/src/main/java/org/torproject/metrics/stats/bwhist/Main.java b/src/main/java/org/torproject/metrics/stats/bwhist/Main.java
index 61c1435..30358f2 100644
--- a/src/main/java/org/torproject/metrics/stats/bwhist/Main.java
+++ b/src/main/java/org/torproject/metrics/stats/bwhist/Main.java
@@ -7,7 +7,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
-import java.nio.file.Paths;
import java.util.Arrays;
/**
@@ -18,11 +17,19 @@ public class Main {
private static Logger log = LoggerFactory.getLogger(Main.class);
- private static String[][] paths = {
- {"recent", "relay-descriptors", "consensuses"},
- {"recent", "relay-descriptors", "extra-infos"},
- {"archive", "relay-descriptors", "consensuses"},
- {"archive", "relay-descriptors", "extra-infos"}};
+ private static String[] paths = {
+ "recent/relay-descriptors/consensuses",
+ "recent/relay-descriptors/extra-infos",
+ "archive/relay-descriptors/consensuses",
+ "archive/relay-descriptors/extra-infos" };
+
+ private static final String jdbcString = String.format(
+ "jdbc:postgresql://localhost/tordir?user=%s&password=%s",
+ System.getProperty("metrics.dbuser", "metrics"),
+ System.getProperty("metrics.dbpass", "password"));
+
+ private static final File baseDir = new File(
+ org.torproject.metrics.stats.main.Main.modulesDir, "bwhist");
/** Executes this data-processing module. */
public static void main(String[] args) throws Exception {
@@ -31,20 +38,20 @@ public class Main {
log.info("Reading descriptors and inserting relevant parts into the "
+ "database.");
- File[] descriptorDirectories = Arrays.stream(paths).map((String[] path)
- -> Paths.get(Configuration.descriptors, path).toFile())
- .toArray(File[]::new);
- File historyFile = new File(Configuration.history);
+ File[] descriptorDirectories = Arrays.stream(paths).map((String path)
+ -> new File(org.torproject.metrics.stats.main.Main.descriptorsDir,
+ path)).toArray(File[]::new);
+ File historyFile = new File(baseDir, "status/read-descriptors");
RelayDescriptorDatabaseImporter database
= new RelayDescriptorDatabaseImporter(descriptorDirectories,
- historyFile, Configuration.database);
+ historyFile, jdbcString);
database.importRelayDescriptors();
log.info("Aggregating database entries.");
database.aggregate();
log.info("Querying aggregated statistics from the database.");
- new Writer().write(Paths.get(Configuration.output, "bandwidth.csv"),
+ new Writer().write(new File(baseDir, "stats/bandwidth.csv").toPath(),
database.queryBandwidth());
log.info("Closing database connection.");
diff --git a/src/main/java/org/torproject/metrics/stats/clients/Database.java b/src/main/java/org/torproject/metrics/stats/clients/Database.java
index 7e783dc..f8bca92 100644
--- a/src/main/java/org/torproject/metrics/stats/clients/Database.java
+++ b/src/main/java/org/torproject/metrics/stats/clients/Database.java
@@ -22,7 +22,10 @@ import java.util.TimeZone;
class Database implements AutoCloseable {
/** Database connection string. */
- private String jdbcString;
+ private static final String jdbcString = String.format(
+ "jdbc:postgresql://localhost/userstats?user=%s&password=%s",
+ System.getProperty("metrics.dbuser", "metrics"),
+ System.getProperty("metrics.dbpass", "password"));
/** Connection object for all interactions with the database. */
private Connection connection;
@@ -33,14 +36,13 @@ class Database implements AutoCloseable {
/** Create a new Database instance and prepare for inserting or querying
* data. */
- Database(String jdbcString) throws SQLException {
- this.jdbcString = jdbcString;
+ Database() throws SQLException {
this.connect();
this.prepareStatements();
}
private void connect() throws SQLException {
- this.connection = DriverManager.getConnection(this.jdbcString);
+ this.connection = DriverManager.getConnection(jdbcString);
this.connection.setAutoCommit(false);
}
diff --git a/src/main/java/org/torproject/metrics/stats/clients/Detector.java b/src/main/java/org/torproject/metrics/stats/clients/Detector.java
index 1a523c2..cceac5e 100644
--- a/src/main/java/org/torproject/metrics/stats/clients/Detector.java
+++ b/src/main/java/org/torproject/metrics/stats/clients/Detector.java
@@ -53,7 +53,6 @@ import java.io.FileWriter;
import java.io.IOException;
import java.io.LineNumberReader;
import java.nio.file.Path;
-import java.nio.file.Paths;
import java.time.LocalDate;
import java.time.format.DateTimeParseException;
import java.util.ArrayList;
@@ -70,10 +69,12 @@ import java.util.stream.Collectors;
public class Detector {
/** Input file. */
- private static final Path INPUT_PATH = Paths.get("stats", "userstats.csv");
+ private static final Path INPUT_PATH = new File(Main.baseDir,
+ "stats/userstats.csv").toPath();
/** Output file. */
- private static final Path OUTPUT_PATH = Paths.get("stats", "clients.csv");
+ private static final Path OUTPUT_PATH = new File(Main.baseDir,
+ "stats/clients.csv").toPath();
/** Number of largest locations to be included in the detection algorithm. */
private static final int NUM_LARGEST_LOCATIONS = 50;
diff --git a/src/main/java/org/torproject/metrics/stats/clients/Main.java b/src/main/java/org/torproject/metrics/stats/clients/Main.java
index 0f1087b..2f22f72 100644
--- a/src/main/java/org/torproject/metrics/stats/clients/Main.java
+++ b/src/main/java/org/torproject/metrics/stats/clients/Main.java
@@ -16,7 +16,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
-import java.nio.file.Paths;
import java.sql.SQLException;
import java.util.Map;
import java.util.SortedMap;
@@ -26,18 +25,18 @@ public class Main {
private static Logger log = LoggerFactory.getLogger(Main.class);
- private static final String jdbcString
- = System.getProperty("clients.database", "jdbc:postgresql:userstats");
-
private static Database database;
+ static final File baseDir = new File(
+ org.torproject.metrics.stats.main.Main.modulesDir, "clients");
+
/** Executes this data-processing module. */
public static void main(String[] args) throws Exception {
log.info("Starting clients module.");
log.info("Connecting to database.");
- database = new Database(jdbcString);
+ database = new Database();
log.info("Reading relay descriptors and importing relevant parts into the "
+ "database.");
@@ -52,10 +51,10 @@ public class Main {
database.commit();
log.info("Querying aggregated statistics from the database.");
- new Writer().write(Paths.get("stats", "userstats.csv"),
+ new Writer().write(new File(baseDir, "stats/userstats.csv").toPath(),
database.queryEstimated());
- new Writer().write(Paths.get("stats", "userstats-combined.csv"),
- database.queryCombined());
+ new Writer().write(new File(baseDir, "stats/userstats-combined.csv")
+ .toPath(), database.queryCombined());
log.info("Disconnecting from database.");
database.close();
@@ -75,13 +74,17 @@ public class Main {
private static void parseRelayDescriptors() throws Exception {
DescriptorReader descriptorReader =
DescriptorSourceFactory.createDescriptorReader();
- File historyFile = new File("status/relay-descriptors");
+ File historyFile = new File(baseDir, "status/relay-descriptors");
descriptorReader.setHistoryFile(historyFile);
for (Descriptor descriptor : descriptorReader.readDescriptors(
- new File("../../shared/in/recent/relay-descriptors/consensuses"),
- new File("../../shared/in/recent/relay-descriptors/extra-infos"),
- new File("../../shared/in/archive/relay-descriptors/consensuses"),
- new File("../../shared/in/archive/relay-descriptors/extra-infos"))) {
+ new File(org.torproject.metrics.stats.main.Main.descriptorsDir,
+ "recent/relay-descriptors/consensuses"),
+ new File(org.torproject.metrics.stats.main.Main.descriptorsDir,
+ "recent/relay-descriptors/extra-infos"),
+ new File(org.torproject.metrics.stats.main.Main.descriptorsDir,
+ "archive/relay-descriptors/consensuses"),
+ new File(org.torproject.metrics.stats.main.Main.descriptorsDir,
+ "archive/relay-descriptors/extra-infos"))) {
if (descriptor instanceof ExtraInfoDescriptor) {
parseRelayExtraInfoDescriptor((ExtraInfoDescriptor) descriptor);
} else if (descriptor instanceof RelayNetworkStatusConsensus) {
@@ -209,11 +212,13 @@ public class Main {
private static void parseBridgeDescriptors() throws Exception {
DescriptorReader descriptorReader =
DescriptorSourceFactory.createDescriptorReader();
- File historyFile = new File("status/bridge-descriptors");
+ File historyFile = new File(baseDir, "status/bridge-descriptors");
descriptorReader.setHistoryFile(historyFile);
for (Descriptor descriptor : descriptorReader.readDescriptors(
- new File("../../shared/in/recent/bridge-descriptors"),
- new File("../../shared/in/archive/bridge-descriptors"))) {
+ new File(org.torproject.metrics.stats.main.Main.descriptorsDir,
+ "recent/bridge-descriptors"),
+ new File(org.torproject.metrics.stats.main.Main.descriptorsDir,
+ "archive/bridge-descriptors"))) {
if (descriptor instanceof ExtraInfoDescriptor) {
parseBridgeExtraInfoDescriptor(
(ExtraInfoDescriptor) descriptor);
diff --git a/src/main/java/org/torproject/metrics/stats/collectdescs/Main.java b/src/main/java/org/torproject/metrics/stats/collectdescs/Main.java
index a9620f5..1d0d840 100644
--- a/src/main/java/org/torproject/metrics/stats/collectdescs/Main.java
+++ b/src/main/java/org/torproject/metrics/stats/collectdescs/Main.java
@@ -10,6 +10,9 @@ import java.io.File;
public class Main {
+ private static final File baseDir = new File(
+ org.torproject.metrics.stats.main.Main.modulesDir, "collectdescs");
+
/** Executes this data-processing module. */
public static void main(String[] args) {
/* Fetch recent descriptors from CollecTor. */
@@ -27,7 +30,7 @@ public class Main {
"/recent/relay-descriptors/votes/",
"/recent/torperf/",
"/recent/webstats/"
- }, 0L, new File("../../shared/in"), true);
+ }, 0L, org.torproject.metrics.stats.main.Main.descriptorsDir, true);
}
}
diff --git a/src/main/java/org/torproject/metrics/stats/connbidirect/Main.java b/src/main/java/org/torproject/metrics/stats/connbidirect/Main.java
index 468ffba..c7fefee 100644
--- a/src/main/java/org/torproject/metrics/stats/connbidirect/Main.java
+++ b/src/main/java/org/torproject/metrics/stats/connbidirect/Main.java
@@ -129,13 +129,18 @@ public class Main {
static final long ONE_DAY_IN_MILLIS = 86400000L;
+ private static final File baseDir = new File(
+ org.torproject.metrics.stats.main.Main.modulesDir, "connbidirect");
+
/** Executes this data-processing module. */
public static void main(String[] args) throws IOException {
- File parseHistoryFile = new File("stats/parse-history");
- File aggregateStatsFile = new File("stats/connbidirect2.csv");
+ File parseHistoryFile = new File(baseDir, "stats/parse-history");
+ File aggregateStatsFile = new File(baseDir, "stats/connbidirect2.csv");
File[] descriptorsDirectories = new File[] {
- new File("../../shared/in/archive/relay-descriptors/extra-infos"),
- new File("../../shared/in/recent/relay-descriptors/extra-infos")};
+ new File(org.torproject.metrics.stats.main.Main.descriptorsDir,
+ "archive/relay-descriptors/extra-infos"),
+ new File(org.torproject.metrics.stats.main.Main.descriptorsDir,
+ "recent/relay-descriptors/extra-infos")};
SortedMap<String, Long> parseHistory = parseParseHistory(
readStringFromFile(parseHistoryFile));
if (parseHistory == null) {
@@ -160,7 +165,7 @@ public class Main {
+ "leave out those descriptors in future runs.");
return;
}
- File rawStatsFile = new File("stats/raw-stats");
+ File rawStatsFile = new File(baseDir, "stats/raw-stats");
SortedSet<RawStat> rawStats = parseRawStats(
readStringFromFile(rawStatsFile));
if (rawStats == null) {
diff --git a/src/main/java/org/torproject/metrics/stats/hidserv/Main.java b/src/main/java/org/torproject/metrics/stats/hidserv/Main.java
index b6a4e43..5076353 100644
--- a/src/main/java/org/torproject/metrics/stats/hidserv/Main.java
+++ b/src/main/java/org/torproject/metrics/stats/hidserv/Main.java
@@ -16,6 +16,9 @@ public class Main {
private static Logger log = LoggerFactory.getLogger(Main.class);
+ private static final File baseDir = new File(
+ org.torproject.metrics.stats.main.Main.modulesDir, "hidserv");
+
/** Parses new descriptors, extrapolate contained statistics using
* computed network fractions, aggregate results, and writes results to
* disk. */
@@ -23,9 +26,11 @@ public class Main {
/* Initialize directories and file paths. */
File[] inDirectories = new File[] {
- new File("../../shared/in/recent/relay-descriptors/consensuses"),
- new File("../../shared/in/recent/relay-descriptors/extra-infos") };
- File statusDirectory = new File("status");
+ new File(org.torproject.metrics.stats.main.Main.descriptorsDir,
+ "recent/relay-descriptors/consensuses"),
+ new File(org.torproject.metrics.stats.main.Main.descriptorsDir,
+ "recent/relay-descriptors/extra-infos") };
+ File statusDirectory = new File(baseDir, "status");
/* Initialize parser and read parse history to avoid parsing
* descriptor files that haven't changed since the last execution. */
@@ -71,7 +76,8 @@ public class Main {
* other statistics. Write the result to a .csv file that can be
* processed by other tools. */
log.info("Aggregating statistics...");
- File hidservStatsExtrapolatedCsvFile = new File("stats/hidserv.csv");
+ File hidservStatsExtrapolatedCsvFile = new File(baseDir,
+ "stats/hidserv.csv");
Aggregator aggregator = new Aggregator(statusDirectory,
extrapolatedHidServStatsStore, hidservStatsExtrapolatedCsvFile);
aggregator.aggregateHidServStats();
diff --git a/src/main/java/org/torproject/metrics/stats/main/Main.java b/src/main/java/org/torproject/metrics/stats/main/Main.java
new file mode 100644
index 0000000..3dc2775
--- /dev/null
+++ b/src/main/java/org/torproject/metrics/stats/main/Main.java
@@ -0,0 +1,122 @@
+package org.torproject.metrics.stats.main;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.nio.file.Files;
+import java.nio.file.StandardCopyOption;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Main {
+
+ private static final Logger log = LoggerFactory.getLogger(Main.class);
+
+ private static final String baseDir = System.getProperty("metrics.basedir",
+ "/srv/metrics.torproject.org/metrics");
+
+ public static final File modulesDir = new File(baseDir, "work/modules");
+
+ public static final File descriptorsDir = new File(baseDir, "work/shared/in");
+
+ private static final File statsDir = new File(baseDir, "shared/stats");
+
+ /** Start the metrics update run. */
+ public static void main(String[] args) {
+
+ log.info("Starting metrics update run.");
+
+ File[] outputDirs = new File[] { modulesDir, statsDir };
+ for (File outputDir : outputDirs) {
+ if (outputDir.exists()) {
+ continue;
+ }
+ if (outputDir.mkdirs()) {
+ log.info("Successfully created module base directory {} and any "
+ + "nonexistent parent directories.",
+ outputDir.getAbsolutePath());
+ } else {
+ log.error("Unable to create module base directory {} and any "
+ + "nonexistent parent directories. Exiting.",
+ outputDir.getAbsolutePath());
+ return;
+ }
+ }
+
+ Class<?>[] modules = new Class<?>[] {
+ org.torproject.metrics.stats.collectdescs.Main.class,
+ org.torproject.metrics.stats.connbidirect.Main.class,
+ org.torproject.metrics.stats.onionperf.Main.class,
+ org.torproject.metrics.stats.bwhist.Main.class,
+ org.torproject.metrics.stats.advbwdist.Main.class,
+ org.torproject.metrics.stats.hidserv.Main.class,
+ org.torproject.metrics.stats.clients.Main.class,
+ org.torproject.metrics.stats.servers.Main.class,
+ org.torproject.metrics.stats.webstats.Main.class,
+ org.torproject.metrics.stats.totalcw.Main.class
+ };
+
+ for (Class<?> module : modules) {
+ try {
+ log.info("Starting {} module.", module.getName());
+ module.getDeclaredMethod("main", String[].class)
+ .invoke(null, (Object) args);
+ log.info("Completed {} module.", module.getName());
+ } catch (NoSuchMethodException | IllegalAccessException
+ | InvocationTargetException e) {
+ log.warn("Caught an exception when invoking the main method of the {} "
+ + "module. Moving on to the next module, if available.", e);
+ }
+ }
+
+ log.info("Making module data available.");
+ File[] moduleStatsDirs = new File[] {
+ new File(modulesDir, "connbidirect/stats"),
+ new File(modulesDir, "onionperf/stats"),
+ new File(modulesDir, "bwhist/stats"),
+ new File(modulesDir, "advbwdist/stats/advbwdist.csv"),
+ new File(modulesDir, "hidserv/stats"),
+ new File(modulesDir, "clients/stats/clients.csv"),
+ new File(modulesDir, "clients/stats/userstats-combined.csv"),
+ new File(modulesDir, "servers/stats"),
+ new File(modulesDir, "webstats/stats"),
+ new File(modulesDir, "totalcw/stats")
+ };
+ List<String> copiedFiles = new ArrayList<>();
+ for (File moduleStatsDir : moduleStatsDirs) {
+ if (!moduleStatsDir.exists()) {
+ log.warn("Skipping nonexistent module stats dir {}.", moduleStatsDir);
+ continue;
+ }
+ File[] moduleStatsFiles = moduleStatsDir.isDirectory()
+ ? moduleStatsDir.listFiles() : new File[] { moduleStatsDir };
+ if (null == moduleStatsFiles) {
+ log.warn("Skipping nonexistent module stats dir {}.", moduleStatsDir);
+ continue;
+ }
+ for (File statsFile : moduleStatsFiles) {
+ if (!statsFile.isFile() || !statsFile.getName().endsWith(".csv")) {
+ continue;
+ }
+ try {
+ Files.copy(statsFile.toPath(),
+ new File(statsDir, statsFile.getName()).toPath(),
+ StandardCopyOption.REPLACE_EXISTING);
+ copiedFiles.add(statsFile.getName());
+ } catch (IOException e) {
+ log.warn("Unable to copy module stats file {} to stats output "
+ + "directory {}. Skipping.", statsFile, statsDir, e);
+ }
+ }
+ }
+ if (!copiedFiles.isEmpty()) {
+ log.info("Successfully copied {} files to stats output directory: {}",
+ copiedFiles.size(), copiedFiles);
+ }
+
+ log.info("Completed metrics update run.");
+ }
+}
diff --git a/src/main/java/org/torproject/metrics/stats/onionperf/Main.java b/src/main/java/org/torproject/metrics/stats/onionperf/Main.java
index 02b70af..a970434 100644
--- a/src/main/java/org/torproject/metrics/stats/onionperf/Main.java
+++ b/src/main/java/org/torproject/metrics/stats/onionperf/Main.java
@@ -13,7 +13,6 @@ import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
-import java.nio.file.Paths;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
@@ -37,23 +36,30 @@ public class Main {
/** Logger for this class. */
private static Logger log = LoggerFactory.getLogger(Main.class);
+ private static final String jdbcString = String.format(
+ "jdbc:postgresql://localhost/onionperf?user=%s&password=%s",
+ System.getProperty("metrics.dbuser", "metrics"),
+ System.getProperty("metrics.dbpass", "password"));
+
+ private static final File baseDir = new File(
+ org.torproject.metrics.stats.main.Main.modulesDir, "onionperf");
+
/** Executes this data-processing module. */
public static void main(String[] args) throws Exception {
log.info("Starting onionperf module.");
- String dbUrlString = "jdbc:postgresql:onionperf";
- Connection connection = connectToDatabase(dbUrlString);
+ Connection connection = connectToDatabase();
importOnionPerfFiles(connection);
- writeStatistics(Paths.get("stats", "torperf-1.1.csv"),
+ writeStatistics(new File(baseDir, "stats/torperf-1.1.csv").toPath(),
queryOnionPerf(connection));
- writeStatistics(Paths.get("stats", "buildtimes.csv"),
+ writeStatistics(new File(baseDir, "stats/buildtimes.csv").toPath(),
queryBuildTimes(connection));
- writeStatistics(Paths.get("stats", "latencies.csv"),
+ writeStatistics(new File(baseDir, "stats/latencies.csv").toPath(),
queryLatencies(connection));
disconnectFromDatabase(connection);
log.info("Terminated onionperf module.");
}
- private static Connection connectToDatabase(String jdbcString)
+ private static Connection connectToDatabase()
throws SQLException {
log.info("Connecting to database.");
Connection connection = DriverManager.getConnection(jdbcString);
@@ -91,8 +97,10 @@ public class Main {
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
DescriptorReader dr = DescriptorSourceFactory.createDescriptorReader();
for (Descriptor d : dr.readDescriptors(
- new File("../../shared/in/archive/torperf"),
- new File("../../shared/in/recent/torperf"))) {
+ new File(org.torproject.metrics.stats.main.Main.descriptorsDir,
+ "archive/torperf"),
+ new File(org.torproject.metrics.stats.main.Main.descriptorsDir,
+ "recent/torperf"))) {
if (!(d instanceof TorperfResult)) {
continue;
}
diff --git a/src/main/java/org/torproject/metrics/stats/servers/Configuration.java b/src/main/java/org/torproject/metrics/stats/servers/Configuration.java
deleted file mode 100644
index 1b7c217..0000000
--- a/src/main/java/org/torproject/metrics/stats/servers/Configuration.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Copyright 2017--2018 The Tor Project
- * See LICENSE for licensing information */
-
-package org.torproject.metrics.stats.servers;
-
-/** Configuration options parsed from Java properties with reasonable hard-coded
- * defaults. */
-class Configuration {
- static String descriptors = System.getProperty("servers.descriptors",
- "../../shared/in/");
- static String database = System.getProperty("servers.database",
- "jdbc:postgresql:ipv6servers");
- static String history = System.getProperty("servers.history",
- "status/read-descriptors");
- static String output = System.getProperty("servers.output",
- "stats/");
-}
-
diff --git a/src/main/java/org/torproject/metrics/stats/servers/Database.java b/src/main/java/org/torproject/metrics/stats/servers/Database.java
index 9c9bda3..f7f1f0f 100644
--- a/src/main/java/org/torproject/metrics/stats/servers/Database.java
+++ b/src/main/java/org/torproject/metrics/stats/servers/Database.java
@@ -29,7 +29,10 @@ import java.util.TimeZone;
class Database implements AutoCloseable {
/** Database connection string. */
- private String jdbcString;
+ private static final String jdbcString = String.format(
+ "jdbc:postgresql://localhost/ipv6servers?user=%s&password=%s",
+ System.getProperty("metrics.dbuser", "metrics"),
+ System.getProperty("metrics.dbpass", "password"));
/** Connection object for all interactions with the database. */
private Connection connection;
@@ -87,15 +90,14 @@ class Database implements AutoCloseable {
/** Create a new Database instance and prepare for inserting or querying
* data. */
- Database(String jdbcString) throws SQLException {
- this.jdbcString = jdbcString;
+ Database() throws SQLException {
this.connect();
this.prepareStatements();
this.initializeCaches();
}
private void connect() throws SQLException {
- this.connection = DriverManager.getConnection(this.jdbcString);
+ this.connection = DriverManager.getConnection(jdbcString);
this.connection.setAutoCommit(false);
}
diff --git a/src/main/java/org/torproject/metrics/stats/servers/Main.java b/src/main/java/org/torproject/metrics/stats/servers/Main.java
index 54f44d0..30010a2 100644
--- a/src/main/java/org/torproject/metrics/stats/servers/Main.java
+++ b/src/main/java/org/torproject/metrics/stats/servers/Main.java
@@ -14,7 +14,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
-import java.nio.file.Paths;
import java.sql.SQLException;
import java.util.Arrays;
@@ -25,15 +24,18 @@ public class Main {
private static Logger log = LoggerFactory.getLogger(Main.class);
- private static String[][] paths = {
- {"recent", "relay-descriptors", "consensuses"},
- {"recent", "relay-descriptors", "server-descriptors"},
- {"recent", "bridge-descriptors", "statuses"},
- {"recent", "bridge-descriptors", "server-descriptors"},
- {"archive", "relay-descriptors", "consensuses"},
- {"archive", "relay-descriptors", "server-descriptors"},
- {"archive", "bridge-descriptors", "statuses"},
- {"archive", "bridge-descriptors", "server-descriptors"}};
+ private static final File baseDir = new File(
+ org.torproject.metrics.stats.main.Main.modulesDir, "servers");
+
+ private static String[] paths = {
+ "recent/relay-descriptors/consensuses",
+ "recent/relay-descriptors/server-descriptors",
+ "recent/bridge-descriptors/statuses",
+ "recent/bridge-descriptors/server-descriptors",
+ "archive/relay-descriptors/consensuses",
+ "archive/relay-descriptors/server-descriptors",
+ "archive/bridge-descriptors/statuses",
+ "archive/bridge-descriptors/server-descriptors" };
/** Run the module. */
public static void main(String[] args) throws Exception {
@@ -43,15 +45,15 @@ public class Main {
log.info("Reading descriptors and inserting relevant parts into the "
+ "database.");
DescriptorReader reader = DescriptorSourceFactory.createDescriptorReader();
- File historyFile = new File(Configuration.history);
+ File historyFile = new File(baseDir, "status/read-descriptors");
reader.setHistoryFile(historyFile);
Parser parser = new Parser();
- try (Database database = new Database(Configuration.database)) {
+ try (Database database = new Database()) {
try {
for (Descriptor descriptor : reader.readDescriptors(
- Arrays.stream(paths).map((String[] path)
- -> Paths.get(Configuration.descriptors, path).toFile())
- .toArray(File[]::new))) {
+ Arrays.stream(paths).map((String path) -> new File(
+ org.torproject.metrics.stats.main.Main.descriptorsDir, path))
+ .toArray(File[]::new))) {
if (descriptor instanceof ServerDescriptor) {
database.insertServerDescriptor(parser.parseServerDescriptor(
(ServerDescriptor) descriptor));
@@ -86,17 +88,18 @@ public class Main {
reader.saveHistoryFile(historyFile);
log.info("Querying aggregated statistics from the database.");
- new Writer().write(Paths.get(Configuration.output, "ipv6servers.csv"),
+ File outputDir = new File(baseDir, "stats");
+ new Writer().write(new File(outputDir, "ipv6servers.csv").toPath(),
database.queryServersIpv6());
- new Writer().write(Paths.get(Configuration.output, "advbw.csv"),
+ new Writer().write(new File(outputDir, "advbw.csv").toPath(),
database.queryAdvbw());
- new Writer().write(Paths.get(Configuration.output, "networksize.csv"),
+ new Writer().write(new File(outputDir, "networksize.csv").toPath(),
database.queryNetworksize());
- new Writer().write(Paths.get(Configuration.output, "relayflags.csv"),
+ new Writer().write(new File(outputDir, "relayflags.csv").toPath(),
database.queryRelayflags());
- new Writer().write(Paths.get(Configuration.output, "versions.csv"),
+ new Writer().write(new File(outputDir, "versions.csv").toPath(),
database.queryVersions());
- new Writer().write(Paths.get(Configuration.output, "platforms.csv"),
+ new Writer().write(new File(outputDir, "platforms.csv").toPath(),
database.queryPlatforms());
log.info("Terminating servers module.");
diff --git a/src/main/java/org/torproject/metrics/stats/totalcw/Configuration.java b/src/main/java/org/torproject/metrics/stats/totalcw/Configuration.java
deleted file mode 100644
index a424f84..0000000
--- a/src/main/java/org/torproject/metrics/stats/totalcw/Configuration.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Copyright 2018 The Tor Project
- * See LICENSE for licensing information */
-
-package org.torproject.metrics.stats.totalcw;
-
-/** Configuration options parsed from Java properties with reasonable hard-coded
- * defaults. */
-class Configuration {
- static String descriptors = System.getProperty("totalcw.descriptors",
- "../../shared/in/");
- static String database = System.getProperty("totalcw.database",
- "jdbc:postgresql:totalcw");
- static String history = System.getProperty("totalcw.history",
- "status/read-descriptors");
- static String output = System.getProperty("totalcw.output",
- "stats/totalcw.csv");
-}
-
diff --git a/src/main/java/org/torproject/metrics/stats/totalcw/Database.java b/src/main/java/org/torproject/metrics/stats/totalcw/Database.java
index e842bc6..eeb24a0 100644
--- a/src/main/java/org/torproject/metrics/stats/totalcw/Database.java
+++ b/src/main/java/org/torproject/metrics/stats/totalcw/Database.java
@@ -25,7 +25,10 @@ import java.util.TimeZone;
class Database implements AutoCloseable {
/** Database connection string. */
- private String jdbcString;
+ private static final String jdbcString = String.format(
+ "jdbc:postgresql://localhost/totalcw?user=%s&password=%s",
+ System.getProperty("metrics.dbuser", "metrics"),
+ System.getProperty("metrics.dbpass", "password"));
/** Connection object for all interactions with the database. */
private Connection connection;
@@ -46,14 +49,13 @@ class Database implements AutoCloseable {
/** Create a new Database instance and prepare for inserting or querying
* data. */
- Database(String jdbcString) throws SQLException {
- this.jdbcString = jdbcString;
+ Database() throws SQLException {
this.connect();
this.prepareStatements();
}
private void connect() throws SQLException {
- this.connection = DriverManager.getConnection(this.jdbcString);
+ this.connection = DriverManager.getConnection(jdbcString);
this.connection.setAutoCommit(false);
}
diff --git a/src/main/java/org/torproject/metrics/stats/totalcw/Main.java b/src/main/java/org/torproject/metrics/stats/totalcw/Main.java
index e5ba8ab..54296be 100644
--- a/src/main/java/org/torproject/metrics/stats/totalcw/Main.java
+++ b/src/main/java/org/torproject/metrics/stats/totalcw/Main.java
@@ -13,7 +13,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
-import java.nio.file.Paths;
import java.sql.SQLException;
import java.util.Arrays;
@@ -24,11 +23,14 @@ public class Main {
private static Logger log = LoggerFactory.getLogger(Main.class);
- private static String[][] paths = {
- {"recent", "relay-descriptors", "consensuses"},
- {"archive", "relay-descriptors", "consensuses"},
- {"recent", "relay-descriptors", "votes"},
- {"archive", "relay-descriptors", "votes"}};
+ private static final File baseDir = new File(
+ org.torproject.metrics.stats.main.Main.modulesDir, "totalcw");
+
+ private static String[] paths = {
+ "recent/relay-descriptors/consensuses",
+ "archive/relay-descriptors/consensuses",
+ "recent/relay-descriptors/votes",
+ "archive/relay-descriptors/votes" };
/** Run the module. */
public static void main(String[] args) throws Exception {
@@ -38,15 +40,15 @@ public class Main {
log.info("Reading consensuses and votes and inserting relevant parts into "
+ "the database.");
DescriptorReader reader = DescriptorSourceFactory.createDescriptorReader();
- File historyFile = new File(Configuration.history);
+ File historyFile = new File(baseDir, "status/read-descriptors");
reader.setHistoryFile(historyFile);
Parser parser = new Parser();
- try (Database database = new Database(Configuration.database)) {
+ try (Database database = new Database()) {
try {
for (Descriptor descriptor : reader.readDescriptors(
- Arrays.stream(paths).map((String[] path)
- -> Paths.get(Configuration.descriptors, path).toFile())
- .toArray(File[]::new))) {
+ Arrays.stream(paths).map((String path) -> new File(
+ org.torproject.metrics.stats.main.Main.descriptorsDir, path))
+ .toArray(File[]::new))) {
if (descriptor instanceof RelayNetworkStatusConsensus) {
database.insertConsensus(parser.parseRelayNetworkStatusConsensus(
(RelayNetworkStatusConsensus) descriptor));
@@ -71,9 +73,10 @@ public class Main {
log.info("Querying aggregated statistics from the database.");
Iterable<OutputLine> output = database.queryTotalcw();
- log.info("Writing aggregated statistics to {}.", Configuration.output);
+ File outputFile = new File(baseDir, "stats/totalcw.csv");
+ log.info("Writing aggregated statistics to {}.", outputFile);
if (null != output) {
- new Writer().write(Paths.get(Configuration.output), output);
+ new Writer().write(outputFile.toPath(), output);
}
log.info("Terminating totalcw module.");
diff --git a/src/main/java/org/torproject/metrics/stats/webstats/Main.java b/src/main/java/org/torproject/metrics/stats/webstats/Main.java
index fb0a903..87b643a 100644
--- a/src/main/java/org/torproject/metrics/stats/webstats/Main.java
+++ b/src/main/java/org/torproject/metrics/stats/webstats/Main.java
@@ -19,7 +19,6 @@ import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
-import java.nio.file.Paths;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
@@ -48,6 +47,11 @@ public class Main {
/** Logger for this class. */
private static Logger log = LoggerFactory.getLogger(Main.class);
+ private static final String jdbcString = String.format(
+ "jdbc:postgresql://localhost/webstats?user=%s&password=%s",
+ System.getProperty("metrics.dbuser", "metrics"),
+ System.getProperty("metrics.dbpass", "password"));
+
private static final String LOG_DATE = "log_date";
private static final String REQUEST_TYPE = "request_type";
@@ -66,22 +70,27 @@ public class Main {
+ PLATFORM + "," + CHANNEL + "," + LOCALE + "," + INCREMENTAL + ","
+ COUNT;
+ private static final File baseDir = new File(
+ org.torproject.metrics.stats.main.Main.modulesDir, "webstats");
+
/** Executes this data-processing module. */
public static void main(String[] args) throws Exception {
log.info("Starting webstats module.");
- String dbUrlString = "jdbc:postgresql:webstats";
- Connection connection = connectToDatabase(dbUrlString);
+ Connection connection = connectToDatabase();
SortedSet<String> skipFiles = queryImportedFileNames(connection);
importLogFiles(connection, skipFiles,
- new File("../../shared/in/recent/webstats"),
- new File("../../shared/in/archive/webstats"));
+ new File(org.torproject.metrics.stats.main.Main.descriptorsDir,
+ "recent/webstats"),
+ new File(org.torproject.metrics.stats.main.Main.descriptorsDir,
+ "archive/webstats"));
SortedSet<String> statistics = queryWebstats(connection);
- writeStatistics(Paths.get("stats", "webstats.csv"), statistics);
+ writeStatistics(new File(baseDir, "stats/webstats.csv").toPath(),
+ statistics);
disconnectFromDatabase(connection);
log.info("Terminated webstats module.");
}
- private static Connection connectToDatabase(String jdbcString)
+ private static Connection connectToDatabase()
throws SQLException {
log.info("Connecting to database.");
Connection connection = DriverManager.getConnection(jdbcString);
1
0

[tor/master] Merge remote-tracking branch 'tor-github/pr/745' into maint-0.4.0
by nickm@torproject.org 07 Mar '19
by nickm@torproject.org 07 Mar '19
07 Mar '19
commit 3af943dcd19d5bdb8fba059e773b6795d4bf89f5
Merge: d8409ccb7 389ee834b
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Thu Mar 7 08:56:35 2019 -0500
Merge remote-tracking branch 'tor-github/pr/745' into maint-0.4.0
changes/bug29144 | 5 +++++
src/core/mainloop/connection.c | 2 +-
2 files changed, 6 insertions(+), 1 deletion(-)
1
0
commit d3fc9aef93a4a5d9732df814c356183c8d5571a1
Merge: 82e1ec408 3af943dcd
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Thu Mar 7 08:57:02 2019 -0500
Merge branch 'maint-0.4.0'
changes/bug29144 | 5 +++++
src/core/mainloop/connection.c | 2 +-
2 files changed, 6 insertions(+), 1 deletion(-)
1
0

[tor/master] Log the correct "auto" port number for listening sockets
by nickm@torproject.org 07 Mar '19
by nickm@torproject.org 07 Mar '19
07 Mar '19
commit 389ee834b6795ccabbe3d4c7edfdaf8d89696438
Author: Kris Katterjohn <katterjohn(a)gmail.com>
Date: Mon Jan 21 13:12:53 2019 -0600
Log the correct "auto" port number for listening sockets
When "auto" was used for the port number for a listening socket, the
message logged after opening the socket would incorrectly say port 0
instead of the actual port used.
Fixes bug 29144; bugfix on 0.3.5.1-alpha
Signed-off-by: Kris Katterjohn <katterjohn(a)gmail.com>
---
changes/bug29144 | 5 +++++
src/core/mainloop/connection.c | 2 +-
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/changes/bug29144 b/changes/bug29144
new file mode 100644
index 000000000..5801224f1
--- /dev/null
+++ b/changes/bug29144
@@ -0,0 +1,5 @@
+ o Minor bugfixes (logging):
+ - Log the correct port number for listening sockets when "auto" is
+ used to let Tor pick the port number. Previously, port 0 was
+ logged instead of the actual port number. Fixes bug 29144;
+ bugfix on 0.3.5.1-alpha. Patch from Kris Katterjohn.
diff --git a/src/core/mainloop/connection.c b/src/core/mainloop/connection.c
index f2a646c5f..7b8dc7f36 100644
--- a/src/core/mainloop/connection.c
+++ b/src/core/mainloop/connection.c
@@ -1527,7 +1527,7 @@ connection_listener_new(const struct sockaddr *listensockaddr,
conn_type_to_string(type), conn->address);
} else {
log_notice(LD_NET, "Opened %s on %s",
- conn_type_to_string(type), fmt_addrport(&addr, usePort));
+ conn_type_to_string(type), fmt_addrport(&addr, gotPort));
}
return conn;
1
0