tor-commits
Threads by month
- ----- 2025 -----
- 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
August 2019
- 19 participants
- 2737 discussions
commit db539453c89368a9ca57663e16834bfc3c44bd7d
Author: Damian Johnson <atagar(a)torproject.org>
Date: Sun Aug 4 14:35:08 2019 -0700
Recache fallback/manual data
With this our ONLINE target once again passes.
---
stem/cached_fallbacks.cfg | 775 +++++++++++++++++++---------------------
stem/cached_manual.sqlite | Bin 248832 -> 249856 bytes
stem/settings.cfg | 1 -
test/integ/manual.py | 6 +-
test/unit/directory/fallback.py | 2 +-
5 files changed, 367 insertions(+), 417 deletions(-)
diff --git a/stem/cached_fallbacks.cfg b/stem/cached_fallbacks.cfg
index 5a725ae6..90f5db5b 100644
--- a/stem/cached_fallbacks.cfg
+++ b/stem/cached_fallbacks.cfg
@@ -1,23 +1,28 @@
-tor_commit 63b4ea22af8e8314dd718f02046de5f4b91edf9d
-stem_commit 206b50519dbdf2881cf72cf9f0cbae453db08ede
-header.timestamp 20181207055710
+tor_commit 1dd95278970f9f32d83a31fe73e0258a30523539
+stem_commit ec67e06398d6bbbcefdc14b56d2e91bd49f47539
+header.timestamp 20190625114911
+header.source whitelist
header.version 2.0.0
-header.timestamp2 20181207195255
-header.timestamp0 20181207055710
-header.timestamp1 20181207193756
+header.timestamp0 20190625114911
+header.timestamp1 20190628085927
header.type fallback
-0111BA9B604669E636FFD5B503F382A4B7AD6E80.address 176.10.104.240
-0111BA9B604669E636FFD5B503F382A4B7AD6E80.or_port 443
-0111BA9B604669E636FFD5B503F382A4B7AD6E80.dir_port 80
-0111BA9B604669E636FFD5B503F382A4B7AD6E80.nickname DigiGesTor1e1
-0111BA9B604669E636FFD5B503F382A4B7AD6E80.has_extrainfo false
-01A9258A46E97FF8B2CAC7910577862C14F2C524.address 193.171.202.146
-01A9258A46E97FF8B2CAC7910577862C14F2C524.or_port 9001
-01A9258A46E97FF8B2CAC7910577862C14F2C524.dir_port 9030
-01A9258A46E97FF8B2CAC7910577862C14F2C524.nickname ins0
-01A9258A46E97FF8B2CAC7910577862C14F2C524.has_extrainfo false
-01A9258A46E97FF8B2CAC7910577862C14F2C524.orport6_address 2001:628:200a:f001:20::146
-01A9258A46E97FF8B2CAC7910577862C14F2C524.orport6_port 9001
+001524DD403D729F08F7E5D77813EF12756CFA8D.address 185.13.39.197
+001524DD403D729F08F7E5D77813EF12756CFA8D.or_port 443
+001524DD403D729F08F7E5D77813EF12756CFA8D.dir_port 80
+001524DD403D729F08F7E5D77813EF12756CFA8D.nickname Neldoreth
+001524DD403D729F08F7E5D77813EF12756CFA8D.has_extrainfo false
+025B66CEBC070FCB0519D206CF0CF4965C20C96E.address 185.100.85.61
+025B66CEBC070FCB0519D206CF0CF4965C20C96E.or_port 443
+025B66CEBC070FCB0519D206CF0CF4965C20C96E.dir_port 80
+025B66CEBC070FCB0519D206CF0CF4965C20C96E.nickname nibbana
+025B66CEBC070FCB0519D206CF0CF4965C20C96E.has_extrainfo false
+0338F9F55111FE8E3570E7DE117EF3AF999CC1D7.address 185.225.17.3
+0338F9F55111FE8E3570E7DE117EF3AF999CC1D7.or_port 443
+0338F9F55111FE8E3570E7DE117EF3AF999CC1D7.dir_port 80
+0338F9F55111FE8E3570E7DE117EF3AF999CC1D7.nickname Nebuchadnezzar
+0338F9F55111FE8E3570E7DE117EF3AF999CC1D7.has_extrainfo false
+0338F9F55111FE8E3570E7DE117EF3AF999CC1D7.orport6_address 2a0a:c800:1:5::3
+0338F9F55111FE8E3570E7DE117EF3AF999CC1D7.orport6_port 443
0B85617241252517E8ECF2CFC7F4C1A32DCD153F.address 163.172.149.155
0B85617241252517E8ECF2CFC7F4C1A32DCD153F.or_port 443
0B85617241252517E8ECF2CFC7F4C1A32DCD153F.dir_port 80
@@ -28,18 +33,6 @@ header.type fallback
0C039F35C2E40DCB71CD8A07E97C7FD7787D42D6.dir_port 80
0C039F35C2E40DCB71CD8A07E97C7FD7787D42D6.nickname libel
0C039F35C2E40DCB71CD8A07E97C7FD7787D42D6.has_extrainfo false
-0C2C599AFCB26F5CFC2C7592435924C1D63D9484.address 5.196.88.122
-0C2C599AFCB26F5CFC2C7592435924C1D63D9484.or_port 9001
-0C2C599AFCB26F5CFC2C7592435924C1D63D9484.dir_port 9030
-0C2C599AFCB26F5CFC2C7592435924C1D63D9484.nickname ATo
-0C2C599AFCB26F5CFC2C7592435924C1D63D9484.has_extrainfo false
-0C2C599AFCB26F5CFC2C7592435924C1D63D9484.orport6_address 2001:41d0:a:fb7a::1
-0C2C599AFCB26F5CFC2C7592435924C1D63D9484.orport6_port 9001
-0E8C0C8315B66DB5F703804B3889A1DD66C67CE0.address 185.100.86.100
-0E8C0C8315B66DB5F703804B3889A1DD66C67CE0.or_port 443
-0E8C0C8315B66DB5F703804B3889A1DD66C67CE0.dir_port 80
-0E8C0C8315B66DB5F703804B3889A1DD66C67CE0.nickname saveyourprivacyex1
-0E8C0C8315B66DB5F703804B3889A1DD66C67CE0.has_extrainfo false
113143469021882C3A4B82F084F8125B08EE471E.address 37.252.185.182
113143469021882C3A4B82F084F8125B08EE471E.or_port 8080
113143469021882C3A4B82F084F8125B08EE471E.dir_port 9030
@@ -54,6 +47,11 @@ header.type fallback
11DF0017A43AF1F08825CD5D973297F81AB00FF3.has_extrainfo false
11DF0017A43AF1F08825CD5D973297F81AB00FF3.orport6_address 2a03:4000:6:724c:df98:15f9:b34d:443
11DF0017A43AF1F08825CD5D973297F81AB00FF3.orport6_port 443
+1211AC1BBB8A1AF7CBA86BCE8689AA3146B86423.address 95.85.8.226
+1211AC1BBB8A1AF7CBA86BCE8689AA3146B86423.or_port 443
+1211AC1BBB8A1AF7CBA86BCE8689AA3146B86423.dir_port 80
+1211AC1BBB8A1AF7CBA86BCE8689AA3146B86423.nickname ccrelaycc
+1211AC1BBB8A1AF7CBA86BCE8689AA3146B86423.has_extrainfo false
12AD30E5D25AA67F519780E2111E611A455FDC89.address 193.11.114.43
12AD30E5D25AA67F519780E2111E611A455FDC89.or_port 9001
12AD30E5D25AA67F519780E2111E611A455FDC89.dir_port 9030
@@ -61,42 +59,23 @@ header.type fallback
12AD30E5D25AA67F519780E2111E611A455FDC89.has_extrainfo false
12AD30E5D25AA67F519780E2111E611A455FDC89.orport6_address 2001:6b0:30:1000::99
12AD30E5D25AA67F519780E2111E611A455FDC89.orport6_port 9050
-136F9299A5009A4E0E96494E723BDB556FB0A26B.address 193.234.15.59
-136F9299A5009A4E0E96494E723BDB556FB0A26B.or_port 443
-136F9299A5009A4E0E96494E723BDB556FB0A26B.dir_port 80
-136F9299A5009A4E0E96494E723BDB556FB0A26B.nickname bakunin2
-136F9299A5009A4E0E96494E723BDB556FB0A26B.has_extrainfo false
-136F9299A5009A4E0E96494E723BDB556FB0A26B.orport6_address 2a00:1c20:4089:1234:bff6:e1bb:1ce3:8dc6
-136F9299A5009A4E0E96494E723BDB556FB0A26B.orport6_port 443
-14419131033443AE6E21DA82B0D307F7CAE42BDB.address 144.76.14.145
-14419131033443AE6E21DA82B0D307F7CAE42BDB.or_port 143
-14419131033443AE6E21DA82B0D307F7CAE42BDB.dir_port 110
-14419131033443AE6E21DA82B0D307F7CAE42BDB.nickname PedicaboMundi
-14419131033443AE6E21DA82B0D307F7CAE42BDB.has_extrainfo false
-14419131033443AE6E21DA82B0D307F7CAE42BDB.orport6_address 2a01:4f8:190:9490::dead
-14419131033443AE6E21DA82B0D307F7CAE42BDB.orport6_port 443
-14877C6384A9E793F422C8D1DDA447CACA4F7C4B.address 185.220.101.9
-14877C6384A9E793F422C8D1DDA447CACA4F7C4B.or_port 20009
-14877C6384A9E793F422C8D1DDA447CACA4F7C4B.dir_port 10009
-14877C6384A9E793F422C8D1DDA447CACA4F7C4B.nickname niftywoodmouse
-14877C6384A9E793F422C8D1DDA447CACA4F7C4B.has_extrainfo false
-1576BE143D8727745BB2BCDDF183291B3C3EFEFC.address 54.37.138.138
-1576BE143D8727745BB2BCDDF183291B3C3EFEFC.or_port 993
-1576BE143D8727745BB2BCDDF183291B3C3EFEFC.dir_port 8080
-1576BE143D8727745BB2BCDDF183291B3C3EFEFC.nickname anotherone
-1576BE143D8727745BB2BCDDF183291B3C3EFEFC.has_extrainfo false
-15BE17C99FACE24470D40AF782D6A9C692AB36D6.address 51.15.78.0
-15BE17C99FACE24470D40AF782D6A9C692AB36D6.or_port 9001
-15BE17C99FACE24470D40AF782D6A9C692AB36D6.dir_port 9030
-15BE17C99FACE24470D40AF782D6A9C692AB36D6.nickname rofltor07
-15BE17C99FACE24470D40AF782D6A9C692AB36D6.has_extrainfo false
-15BE17C99FACE24470D40AF782D6A9C692AB36D6.orport6_address 2001:bc8:4700:2300::16:c0b
-15BE17C99FACE24470D40AF782D6A9C692AB36D6.orport6_port 9001
-185F2A57B0C4620582602761097D17DB81654F70.address 204.11.50.131
-185F2A57B0C4620582602761097D17DB81654F70.or_port 9001
-185F2A57B0C4620582602761097D17DB81654F70.dir_port 9030
-185F2A57B0C4620582602761097D17DB81654F70.nickname BoingBoing
-185F2A57B0C4620582602761097D17DB81654F70.has_extrainfo false
+12FD624EE73CEF37137C90D38B2406A66F68FAA2.address 37.157.195.87
+12FD624EE73CEF37137C90D38B2406A66F68FAA2.or_port 443
+12FD624EE73CEF37137C90D38B2406A66F68FAA2.dir_port 8030
+12FD624EE73CEF37137C90D38B2406A66F68FAA2.nickname thanatosCZ
+12FD624EE73CEF37137C90D38B2406A66F68FAA2.has_extrainfo false
+183005F78229D94EE51CE7795A42280070A48D0D.address 217.182.51.248
+183005F78229D94EE51CE7795A42280070A48D0D.or_port 443
+183005F78229D94EE51CE7795A42280070A48D0D.dir_port 80
+183005F78229D94EE51CE7795A42280070A48D0D.nickname Cosworth02
+183005F78229D94EE51CE7795A42280070A48D0D.has_extrainfo false
+185663B7C12777F052B2C2D23D7A239D8DA88A0F.address 171.25.193.25
+185663B7C12777F052B2C2D23D7A239D8DA88A0F.or_port 443
+185663B7C12777F052B2C2D23D7A239D8DA88A0F.dir_port 80
+185663B7C12777F052B2C2D23D7A239D8DA88A0F.nickname DFRI5
+185663B7C12777F052B2C2D23D7A239D8DA88A0F.has_extrainfo false
+185663B7C12777F052B2C2D23D7A239D8DA88A0F.orport6_address 2001:67c:289c::25
+185663B7C12777F052B2C2D23D7A239D8DA88A0F.orport6_port 443
1938EBACBB1A7BFA888D9623C90061130E63BB3F.address 149.56.141.138
1938EBACBB1A7BFA888D9623C90061130E63BB3F.or_port 9001
1938EBACBB1A7BFA888D9623C90061130E63BB3F.dir_port 9030
@@ -107,13 +86,13 @@ header.type fallback
1AE039EE0B11DB79E4B4B29CBA9F752864A0259E.dir_port 9001
1AE039EE0B11DB79E4B4B29CBA9F752864A0259E.nickname Ichotolot60
1AE039EE0B11DB79E4B4B29CBA9F752864A0259E.has_extrainfo true
-1C90D3AEADFF3BCD079810632C8B85637924A58E.address 163.172.53.84
-1C90D3AEADFF3BCD079810632C8B85637924A58E.or_port 21
-1C90D3AEADFF3BCD079810632C8B85637924A58E.dir_port 143
-1C90D3AEADFF3BCD079810632C8B85637924A58E.nickname Multivac
-1C90D3AEADFF3BCD079810632C8B85637924A58E.has_extrainfo false
-1C90D3AEADFF3BCD079810632C8B85637924A58E.orport6_address 2001:bc8:24f8::
-1C90D3AEADFF3BCD079810632C8B85637924A58E.orport6_port 21
+1CD17CB202063C51C7DAD3BACEF87ECE81C2350F.address 50.7.74.171
+1CD17CB202063C51C7DAD3BACEF87ECE81C2350F.or_port 9001
+1CD17CB202063C51C7DAD3BACEF87ECE81C2350F.dir_port 9030
+1CD17CB202063C51C7DAD3BACEF87ECE81C2350F.nickname theia1
+1CD17CB202063C51C7DAD3BACEF87ECE81C2350F.has_extrainfo false
+1CD17CB202063C51C7DAD3BACEF87ECE81C2350F.orport6_address 2001:49f0:d002:2::51
+1CD17CB202063C51C7DAD3BACEF87ECE81C2350F.orport6_port 443
1F6ABD086F40B890A33C93CC4606EE68B31C9556.address 199.184.246.250
1F6ABD086F40B890A33C93CC4606EE68B31C9556.or_port 443
1F6ABD086F40B890A33C93CC4606EE68B31C9556.dir_port 80
@@ -128,45 +107,33 @@ header.type fallback
20462CBA5DA4C2D963567D17D0B7249718114A68.has_extrainfo false
20462CBA5DA4C2D963567D17D0B7249718114A68.orport6_address 2001:bc8:4400:2100::f03
20462CBA5DA4C2D963567D17D0B7249718114A68.orport6_port 9001
+204DFD2A2C6A0DC1FA0EACB495218E0B661704FD.address 77.247.181.164
+204DFD2A2C6A0DC1FA0EACB495218E0B661704FD.or_port 443
+204DFD2A2C6A0DC1FA0EACB495218E0B661704FD.dir_port 80
+204DFD2A2C6A0DC1FA0EACB495218E0B661704FD.nickname HaveHeart
+204DFD2A2C6A0DC1FA0EACB495218E0B661704FD.has_extrainfo false
230A8B2A8BA861210D9B4BA97745AEC217A94207.address 163.172.176.167
230A8B2A8BA861210D9B4BA97745AEC217A94207.or_port 443
230A8B2A8BA861210D9B4BA97745AEC217A94207.dir_port 80
230A8B2A8BA861210D9B4BA97745AEC217A94207.nickname niij01
230A8B2A8BA861210D9B4BA97745AEC217A94207.has_extrainfo false
-24E91955D969AEA1D80413C64FE106FAE7FD2EA9.address 185.220.101.8
-24E91955D969AEA1D80413C64FE106FAE7FD2EA9.or_port 20008
-24E91955D969AEA1D80413C64FE106FAE7FD2EA9.dir_port 10008
-24E91955D969AEA1D80413C64FE106FAE7FD2EA9.nickname niftymouse
-24E91955D969AEA1D80413C64FE106FAE7FD2EA9.has_extrainfo false
-2BA2C8E96B2590E1072AECE2BDB5C48921BF8510.address 138.201.250.33
-2BA2C8E96B2590E1072AECE2BDB5C48921BF8510.or_port 9011
-2BA2C8E96B2590E1072AECE2BDB5C48921BF8510.dir_port 9012
-2BA2C8E96B2590E1072AECE2BDB5C48921BF8510.nickname storm
-2BA2C8E96B2590E1072AECE2BDB5C48921BF8510.has_extrainfo false
-2CDCFED0142B28B002E89D305CBA2E26063FADE2.address 193.234.15.56
-2CDCFED0142B28B002E89D305CBA2E26063FADE2.or_port 443
-2CDCFED0142B28B002E89D305CBA2E26063FADE2.dir_port 80
-2CDCFED0142B28B002E89D305CBA2E26063FADE2.nickname jaures
-2CDCFED0142B28B002E89D305CBA2E26063FADE2.has_extrainfo false
-2CDCFED0142B28B002E89D305CBA2E26063FADE2.orport6_address 2a00:1c20:4089:1234:cd49:b58a:9ebe:67ec
-2CDCFED0142B28B002E89D305CBA2E26063FADE2.orport6_port 443
2F0F32AB1E5B943CA7D062C03F18960C86E70D94.address 97.74.237.196
2F0F32AB1E5B943CA7D062C03F18960C86E70D94.or_port 9001
2F0F32AB1E5B943CA7D062C03F18960C86E70D94.dir_port 9030
2F0F32AB1E5B943CA7D062C03F18960C86E70D94.nickname Minotaur
2F0F32AB1E5B943CA7D062C03F18960C86E70D94.has_extrainfo false
-311A4533F7A2415F42346A6C8FA77E6FD279594C.address 94.230.208.147
-311A4533F7A2415F42346A6C8FA77E6FD279594C.or_port 8443
-311A4533F7A2415F42346A6C8FA77E6FD279594C.dir_port 8080
-311A4533F7A2415F42346A6C8FA77E6FD279594C.nickname DigiGesTor3e2
-311A4533F7A2415F42346A6C8FA77E6FD279594C.has_extrainfo false
-311A4533F7A2415F42346A6C8FA77E6FD279594C.orport6_address 2a02:418:6017::147
-311A4533F7A2415F42346A6C8FA77E6FD279594C.orport6_port 8443
322C6E3A973BC10FC36DE3037AD27BC89F14723B.address 212.83.154.33
322C6E3A973BC10FC36DE3037AD27BC89F14723B.or_port 8443
322C6E3A973BC10FC36DE3037AD27BC89F14723B.dir_port 8080
322C6E3A973BC10FC36DE3037AD27BC89F14723B.nickname bauruine204
322C6E3A973BC10FC36DE3037AD27BC89F14723B.has_extrainfo false
+32EE911D968BE3E016ECA572BB1ED0A9EE43FC2F.address 109.105.109.162
+32EE911D968BE3E016ECA572BB1ED0A9EE43FC2F.or_port 60784
+32EE911D968BE3E016ECA572BB1ED0A9EE43FC2F.dir_port 52860
+32EE911D968BE3E016ECA572BB1ED0A9EE43FC2F.nickname ndnr1
+32EE911D968BE3E016ECA572BB1ED0A9EE43FC2F.has_extrainfo false
+32EE911D968BE3E016ECA572BB1ED0A9EE43FC2F.orport6_address 2001:948:7:2::163
+32EE911D968BE3E016ECA572BB1ED0A9EE43FC2F.orport6_port 5001
330CD3DB6AD266DC70CDB512B036957D03D9BC59.address 185.100.84.212
330CD3DB6AD266DC70CDB512B036957D03D9BC59.or_port 443
330CD3DB6AD266DC70CDB512B036957D03D9BC59.dir_port 80
@@ -174,40 +141,49 @@ header.type fallback
330CD3DB6AD266DC70CDB512B036957D03D9BC59.has_extrainfo false
330CD3DB6AD266DC70CDB512B036957D03D9BC59.orport6_address 2a06:1700:0:7::1
330CD3DB6AD266DC70CDB512B036957D03D9BC59.orport6_port 443
-360CBA08D1E24F513162047BDB54A1015E531534.address 54.37.17.235
-360CBA08D1E24F513162047BDB54A1015E531534.or_port 9001
-360CBA08D1E24F513162047BDB54A1015E531534.dir_port 9030
-360CBA08D1E24F513162047BDB54A1015E531534.nickname Aerodynamik06
-360CBA08D1E24F513162047BDB54A1015E531534.has_extrainfo false
361D33C96D0F161275EE67E2C91EE10B276E778B.address 37.157.255.35
361D33C96D0F161275EE67E2C91EE10B276E778B.or_port 9090
361D33C96D0F161275EE67E2C91EE10B276E778B.dir_port 9030
361D33C96D0F161275EE67E2C91EE10B276E778B.nickname cxx4freedom
361D33C96D0F161275EE67E2C91EE10B276E778B.has_extrainfo false
-36B9E7AC1E36B62A9D6F330ABEB6012BA7F0D400.address 37.187.22.87
-36B9E7AC1E36B62A9D6F330ABEB6012BA7F0D400.or_port 9001
-36B9E7AC1E36B62A9D6F330ABEB6012BA7F0D400.dir_port 9030
-36B9E7AC1E36B62A9D6F330ABEB6012BA7F0D400.nickname kimsufi321
-36B9E7AC1E36B62A9D6F330ABEB6012BA7F0D400.has_extrainfo false
-36B9E7AC1E36B62A9D6F330ABEB6012BA7F0D400.orport6_address 2001:41d0:a:1657::1
-36B9E7AC1E36B62A9D6F330ABEB6012BA7F0D400.orport6_port 9001
375DCBB2DBD94E5263BC0C015F0C9E756669617E.address 64.79.152.132
375DCBB2DBD94E5263BC0C015F0C9E756669617E.or_port 443
375DCBB2DBD94E5263BC0C015F0C9E756669617E.dir_port 80
375DCBB2DBD94E5263BC0C015F0C9E756669617E.nickname ebola
375DCBB2DBD94E5263BC0C015F0C9E756669617E.has_extrainfo false
-387B065A38E4DAA16D9D41C2964ECBC4B31D30FF.address 62.210.92.11
-387B065A38E4DAA16D9D41C2964ECBC4B31D30FF.or_port 9101
-387B065A38E4DAA16D9D41C2964ECBC4B31D30FF.dir_port 9130
-387B065A38E4DAA16D9D41C2964ECBC4B31D30FF.nickname redjohn1
-387B065A38E4DAA16D9D41C2964ECBC4B31D30FF.has_extrainfo false
-387B065A38E4DAA16D9D41C2964ECBC4B31D30FF.orport6_address 2001:bc8:338c::1
-387B065A38E4DAA16D9D41C2964ECBC4B31D30FF.orport6_port 9101
-39F096961ED2576975C866D450373A9913AFDC92.address 198.50.191.95
-39F096961ED2576975C866D450373A9913AFDC92.or_port 443
-39F096961ED2576975C866D450373A9913AFDC92.dir_port 80
-39F096961ED2576975C866D450373A9913AFDC92.nickname thomas
-39F096961ED2576975C866D450373A9913AFDC92.has_extrainfo false
+39F91959416763AFD34DBEEC05474411B964B2DC.address 213.183.60.21
+39F91959416763AFD34DBEEC05474411B964B2DC.or_port 443
+39F91959416763AFD34DBEEC05474411B964B2DC.dir_port 9030
+39F91959416763AFD34DBEEC05474411B964B2DC.nickname angeltest11
+39F91959416763AFD34DBEEC05474411B964B2DC.has_extrainfo false
+3AFDAAD91A15B4C6A7686A53AA8627CA871FF491.address 50.7.74.174
+3AFDAAD91A15B4C6A7686A53AA8627CA871FF491.or_port 9001
+3AFDAAD91A15B4C6A7686A53AA8627CA871FF491.dir_port 9030
+3AFDAAD91A15B4C6A7686A53AA8627CA871FF491.nickname theia7
+3AFDAAD91A15B4C6A7686A53AA8627CA871FF491.has_extrainfo false
+3AFDAAD91A15B4C6A7686A53AA8627CA871FF491.orport6_address 2001:49f0:d002:2::57
+3AFDAAD91A15B4C6A7686A53AA8627CA871FF491.orport6_port 443
+3CA0D15567024D2E0B557DC0CF3E962B37999A79.address 199.249.230.83
+3CA0D15567024D2E0B557DC0CF3E962B37999A79.or_port 443
+3CA0D15567024D2E0B557DC0CF3E962B37999A79.dir_port 80
+3CA0D15567024D2E0B557DC0CF3E962B37999A79.nickname QuintexAirVPN30
+3CA0D15567024D2E0B557DC0CF3E962B37999A79.has_extrainfo false
+3CA0D15567024D2E0B557DC0CF3E962B37999A79.orport6_address 2620:7:6001::ffff:c759:e653
+3CA0D15567024D2E0B557DC0CF3E962B37999A79.orport6_port 80
+3CB4193EF4E239FCEDC4DC43468E0B0D6B67ACC3.address 51.38.65.160
+3CB4193EF4E239FCEDC4DC43468E0B0D6B67ACC3.or_port 9001
+3CB4193EF4E239FCEDC4DC43468E0B0D6B67ACC3.dir_port 9030
+3CB4193EF4E239FCEDC4DC43468E0B0D6B67ACC3.nickname rofltor10
+3CB4193EF4E239FCEDC4DC43468E0B0D6B67ACC3.has_extrainfo false
+3CB4193EF4E239FCEDC4DC43468E0B0D6B67ACC3.orport6_address 2001:41d0:801:2000::f6e
+3CB4193EF4E239FCEDC4DC43468E0B0D6B67ACC3.orport6_port 9001
+3E53D3979DB07EFD736661C934A1DED14127B684.address 217.79.179.177
+3E53D3979DB07EFD736661C934A1DED14127B684.or_port 9001
+3E53D3979DB07EFD736661C934A1DED14127B684.dir_port 9030
+3E53D3979DB07EFD736661C934A1DED14127B684.nickname Unnamed
+3E53D3979DB07EFD736661C934A1DED14127B684.has_extrainfo false
+3E53D3979DB07EFD736661C934A1DED14127B684.orport6_address 2001:4ba0:fff9:131:6c4f::90d3
+3E53D3979DB07EFD736661C934A1DED14127B684.orport6_port 9001
3F092986E9B87D3FDA09B71FA3A602378285C77A.address 66.111.2.16
3F092986E9B87D3FDA09B71FA3A602378285C77A.or_port 9001
3F092986E9B87D3FDA09B71FA3A602378285C77A.dir_port 9030
@@ -220,57 +196,33 @@ header.type fallback
4061C553CA88021B8302F0814365070AAE617270.dir_port 9030
4061C553CA88021B8302F0814365070AAE617270.nickname TorExitRomania
4061C553CA88021B8302F0814365070AAE617270.has_extrainfo false
-41A3C16269C7B63DB6EB741DBDDB4E1F586B1592.address 195.191.81.7
-41A3C16269C7B63DB6EB741DBDDB4E1F586B1592.or_port 9001
-41A3C16269C7B63DB6EB741DBDDB4E1F586B1592.dir_port 9030
-41A3C16269C7B63DB6EB741DBDDB4E1F586B1592.nickname rofltor02
-41A3C16269C7B63DB6EB741DBDDB4E1F586B1592.has_extrainfo false
-41A3C16269C7B63DB6EB741DBDDB4E1F586B1592.orport6_address 2a00:1908:fffc:ffff:c0a6:ccff:fe62:e1a1
-41A3C16269C7B63DB6EB741DBDDB4E1F586B1592.orport6_port 9001
-41C59606AFE1D1AA6EC6EF6719690B856F0B6587.address 178.17.170.156
-41C59606AFE1D1AA6EC6EF6719690B856F0B6587.or_port 9001
-41C59606AFE1D1AA6EC6EF6719690B856F0B6587.dir_port 9030
-41C59606AFE1D1AA6EC6EF6719690B856F0B6587.nickname TorExitMoldova2
-41C59606AFE1D1AA6EC6EF6719690B856F0B6587.has_extrainfo false
-41C59606AFE1D1AA6EC6EF6719690B856F0B6587.orport6_address 2a00:1dc0:caff:48::9257
-41C59606AFE1D1AA6EC6EF6719690B856F0B6587.orport6_port 9001
-45362E8ECD651CCAC521156FFBD2FF7F27FA8E88.address 81.7.10.251
-45362E8ECD651CCAC521156FFBD2FF7F27FA8E88.or_port 443
-45362E8ECD651CCAC521156FFBD2FF7F27FA8E88.dir_port 80
-45362E8ECD651CCAC521156FFBD2FF7F27FA8E88.nickname torpidsDEisppro2
-45362E8ECD651CCAC521156FFBD2FF7F27FA8E88.has_extrainfo false
-45362E8ECD651CCAC521156FFBD2FF7F27FA8E88.orport6_address 2a02:180:1:1::517:afb
-45362E8ECD651CCAC521156FFBD2FF7F27FA8E88.orport6_port 443
4623A9EC53BFD83155929E56D6F7B55B5E718C24.address 163.172.157.213
4623A9EC53BFD83155929E56D6F7B55B5E718C24.or_port 443
4623A9EC53BFD83155929E56D6F7B55B5E718C24.dir_port 8080
4623A9EC53BFD83155929E56D6F7B55B5E718C24.nickname Cotopaxi
4623A9EC53BFD83155929E56D6F7B55B5E718C24.has_extrainfo false
-4661DE96D3F8E923994B05218F23760C8D7935A4.address 132.248.241.5
-4661DE96D3F8E923994B05218F23760C8D7935A4.or_port 9001
-4661DE96D3F8E923994B05218F23760C8D7935A4.dir_port 9030
-4661DE96D3F8E923994B05218F23760C8D7935A4.nickname toritounam
-4661DE96D3F8E923994B05218F23760C8D7935A4.has_extrainfo false
+465D17C6FC297E3857B5C6F152006A1E212944EA.address 195.123.245.141
+465D17C6FC297E3857B5C6F152006A1E212944EA.or_port 443
+465D17C6FC297E3857B5C6F152006A1E212944EA.dir_port 9030
+465D17C6FC297E3857B5C6F152006A1E212944EA.nickname angeltest14
+465D17C6FC297E3857B5C6F152006A1E212944EA.has_extrainfo false
46791D156C9B6C255C2665D4D8393EC7DBAA7798.address 31.31.78.49
46791D156C9B6C255C2665D4D8393EC7DBAA7798.or_port 443
46791D156C9B6C255C2665D4D8393EC7DBAA7798.dir_port 80
46791D156C9B6C255C2665D4D8393EC7DBAA7798.nickname KrigHaBandolo
46791D156C9B6C255C2665D4D8393EC7DBAA7798.has_extrainfo false
-47C42E2094EE482E7C9B586B10BABFB67557030B.address 185.220.101.34
-47C42E2094EE482E7C9B586B10BABFB67557030B.or_port 20034
-47C42E2094EE482E7C9B586B10BABFB67557030B.dir_port 10034
-47C42E2094EE482E7C9B586B10BABFB67557030B.nickname niftysugarglider
-47C42E2094EE482E7C9B586B10BABFB67557030B.has_extrainfo false
484A10BA2B8D48A5F0216674C8DD50EF27BC32F3.address 193.70.43.76
484A10BA2B8D48A5F0216674C8DD50EF27BC32F3.or_port 9001
484A10BA2B8D48A5F0216674C8DD50EF27BC32F3.dir_port 9030
484A10BA2B8D48A5F0216674C8DD50EF27BC32F3.nickname Aerodynamik03
484A10BA2B8D48A5F0216674C8DD50EF27BC32F3.has_extrainfo false
-4CC9CC9195EC38645B699A33307058624F660CCF.address 51.254.101.242
-4CC9CC9195EC38645B699A33307058624F660CCF.or_port 9001
-4CC9CC9195EC38645B699A33307058624F660CCF.dir_port 9002
-4CC9CC9195EC38645B699A33307058624F660CCF.nickname devsum
-4CC9CC9195EC38645B699A33307058624F660CCF.has_extrainfo false
+489D94333DF66D57FFE34D9D59CC2D97E2CB0053.address 37.187.102.186
+489D94333DF66D57FFE34D9D59CC2D97E2CB0053.or_port 9001
+489D94333DF66D57FFE34D9D59CC2D97E2CB0053.dir_port 9030
+489D94333DF66D57FFE34D9D59CC2D97E2CB0053.nickname txtfileTorNode65536
+489D94333DF66D57FFE34D9D59CC2D97E2CB0053.has_extrainfo false
+489D94333DF66D57FFE34D9D59CC2D97E2CB0053.orport6_address 2001:41d0:a:26ba::1
+489D94333DF66D57FFE34D9D59CC2D97E2CB0053.orport6_port 9001
4EB55679FA91363B97372554F8DC7C63F4E5B101.address 81.7.13.84
4EB55679FA91363B97372554F8DC7C63F4E5B101.or_port 443
4EB55679FA91363B97372554F8DC7C63F4E5B101.dir_port 80
@@ -278,11 +230,18 @@ header.type fallback
4EB55679FA91363B97372554F8DC7C63F4E5B101.has_extrainfo false
4EB55679FA91363B97372554F8DC7C63F4E5B101.orport6_address 2a02:180:1:1::5b8f:538c
4EB55679FA91363B97372554F8DC7C63F4E5B101.orport6_port 443
-50586E25BE067FD1F739998550EDDCB1A14CA5B2.address 212.51.134.123
-50586E25BE067FD1F739998550EDDCB1A14CA5B2.or_port 9001
-50586E25BE067FD1F739998550EDDCB1A14CA5B2.dir_port 9030
-50586E25BE067FD1F739998550EDDCB1A14CA5B2.nickname Jans
-50586E25BE067FD1F739998550EDDCB1A14CA5B2.has_extrainfo false
+4F0DB7E687FC7C0AE55C8F243DA8B0EB27FBF1F2.address 108.53.208.157
+4F0DB7E687FC7C0AE55C8F243DA8B0EB27FBF1F2.or_port 443
+4F0DB7E687FC7C0AE55C8F243DA8B0EB27FBF1F2.dir_port 80
+4F0DB7E687FC7C0AE55C8F243DA8B0EB27FBF1F2.nickname Binnacle
+4F0DB7E687FC7C0AE55C8F243DA8B0EB27FBF1F2.has_extrainfo true
+509EAB4C5D10C9A9A24B4EA0CE402C047A2D64E6.address 5.9.158.75
+509EAB4C5D10C9A9A24B4EA0CE402C047A2D64E6.or_port 9001
+509EAB4C5D10C9A9A24B4EA0CE402C047A2D64E6.dir_port 9030
+509EAB4C5D10C9A9A24B4EA0CE402C047A2D64E6.nickname zwiebeltoralf2
+509EAB4C5D10C9A9A24B4EA0CE402C047A2D64E6.has_extrainfo true
+509EAB4C5D10C9A9A24B4EA0CE402C047A2D64E6.orport6_address 2a01:4f8:190:514a::2
+509EAB4C5D10C9A9A24B4EA0CE402C047A2D64E6.orport6_port 9001
51E1CF613FD6F9F11FE24743C91D6F9981807D82.address 81.7.16.182
51E1CF613FD6F9F11FE24743C91D6F9981807D82.or_port 443
51E1CF613FD6F9F11FE24743C91D6F9981807D82.dir_port 80
@@ -290,11 +249,6 @@ header.type fallback
51E1CF613FD6F9F11FE24743C91D6F9981807D82.has_extrainfo false
51E1CF613FD6F9F11FE24743C91D6F9981807D82.orport6_address 2a02:180:1:1::517:10b6
51E1CF613FD6F9F11FE24743C91D6F9981807D82.orport6_port 993
-52BFADA8BEAA01BA46C8F767F83C18E2FE50C1B9.address 85.25.159.65
-52BFADA8BEAA01BA46C8F767F83C18E2FE50C1B9.or_port 80
-52BFADA8BEAA01BA46C8F767F83C18E2FE50C1B9.dir_port 995
-52BFADA8BEAA01BA46C8F767F83C18E2FE50C1B9.nickname BeastieJoy63
-52BFADA8BEAA01BA46C8F767F83C18E2FE50C1B9.has_extrainfo false
547DA56F6B88B6C596B3E3086803CDA4F0EF8F21.address 192.160.102.166
547DA56F6B88B6C596B3E3086803CDA4F0EF8F21.or_port 9001
547DA56F6B88B6C596B3E3086803CDA4F0EF8F21.dir_port 80
@@ -309,40 +263,37 @@ header.type fallback
557ACEC850F54EEE65839F83CACE2B0825BE811E.has_extrainfo false
557ACEC850F54EEE65839F83CACE2B0825BE811E.orport6_address 2620:132:300c:c01d::a
557ACEC850F54EEE65839F83CACE2B0825BE811E.orport6_port 9002
-587E0A9552E4274B251F29B5B2673D38442EE4BF.address 95.130.12.119
-587E0A9552E4274B251F29B5B2673D38442EE4BF.or_port 443
-587E0A9552E4274B251F29B5B2673D38442EE4BF.dir_port 80
-587E0A9552E4274B251F29B5B2673D38442EE4BF.nickname Nuath
-587E0A9552E4274B251F29B5B2673D38442EE4BF.has_extrainfo false
-58ED9C9C35E433EE58764D62892B4FFD518A3CD0.address 185.21.100.50
-58ED9C9C35E433EE58764D62892B4FFD518A3CD0.or_port 9001
-58ED9C9C35E433EE58764D62892B4FFD518A3CD0.dir_port 9030
-58ED9C9C35E433EE58764D62892B4FFD518A3CD0.nickname SamAAdams2
-58ED9C9C35E433EE58764D62892B4FFD518A3CD0.has_extrainfo false
-58ED9C9C35E433EE58764D62892B4FFD518A3CD0.orport6_address 2a00:1158:2:cd00:0:74:6f:72
-58ED9C9C35E433EE58764D62892B4FFD518A3CD0.orport6_port 443
-5CF8AFA5E4B0BB88942A44A3F3AAE08C3BDFD60B.address 193.234.15.62
-5CF8AFA5E4B0BB88942A44A3F3AAE08C3BDFD60B.or_port 443
-5CF8AFA5E4B0BB88942A44A3F3AAE08C3BDFD60B.dir_port 80
-5CF8AFA5E4B0BB88942A44A3F3AAE08C3BDFD60B.nickname jaures4
-5CF8AFA5E4B0BB88942A44A3F3AAE08C3BDFD60B.has_extrainfo false
-5CF8AFA5E4B0BB88942A44A3F3AAE08C3BDFD60B.orport6_address 2a00:1c20:4089:1234:a6a4:2926:d0af:dfee
-5CF8AFA5E4B0BB88942A44A3F3AAE08C3BDFD60B.orport6_port 443
+5BF17163CBE73D8CD9FDBE030C944EA05707DA93.address 50.7.74.170
+5BF17163CBE73D8CD9FDBE030C944EA05707DA93.or_port 443
+5BF17163CBE73D8CD9FDBE030C944EA05707DA93.dir_port 80
+5BF17163CBE73D8CD9FDBE030C944EA05707DA93.nickname theia8
+5BF17163CBE73D8CD9FDBE030C944EA05707DA93.has_extrainfo false
+5BF17163CBE73D8CD9FDBE030C944EA05707DA93.orport6_address 2001:49f0:d002:2::58
+5BF17163CBE73D8CD9FDBE030C944EA05707DA93.orport6_port 443
5E56738E7F97AA81DEEF59AF28494293DFBFCCDF.address 172.98.193.43
5E56738E7F97AA81DEEF59AF28494293DFBFCCDF.or_port 443
5E56738E7F97AA81DEEF59AF28494293DFBFCCDF.dir_port 80
5E56738E7F97AA81DEEF59AF28494293DFBFCCDF.nickname Backplane
5E56738E7F97AA81DEEF59AF28494293DFBFCCDF.has_extrainfo false
-609E598FB6A00BCF7872906B602B705B64541C50.address 185.220.101.28
-609E598FB6A00BCF7872906B602B705B64541C50.or_port 20028
-609E598FB6A00BCF7872906B602B705B64541C50.dir_port 10028
-609E598FB6A00BCF7872906B602B705B64541C50.nickname niftychipmunk
-609E598FB6A00BCF7872906B602B705B64541C50.has_extrainfo false
+616081EC829593AF4232550DE6FFAA1D75B37A90.address 95.128.43.164
+616081EC829593AF4232550DE6FFAA1D75B37A90.or_port 443
+616081EC829593AF4232550DE6FFAA1D75B37A90.dir_port 80
+616081EC829593AF4232550DE6FFAA1D75B37A90.nickname AquaRayTerminus
+616081EC829593AF4232550DE6FFAA1D75B37A90.has_extrainfo false
+616081EC829593AF4232550DE6FFAA1D75B37A90.orport6_address 2a02:ec0:209:10::4
+616081EC829593AF4232550DE6FFAA1D75B37A90.orport6_port 443
68F175CCABE727AA2D2309BCD8789499CEE36ED7.address 163.172.139.104
68F175CCABE727AA2D2309BCD8789499CEE36ED7.or_port 443
68F175CCABE727AA2D2309BCD8789499CEE36ED7.dir_port 8080
68F175CCABE727AA2D2309BCD8789499CEE36ED7.nickname Pichincha
68F175CCABE727AA2D2309BCD8789499CEE36ED7.has_extrainfo false
+6A7551EEE18F78A9813096E82BF84F740D32B911.address 94.130.186.5
+6A7551EEE18F78A9813096E82BF84F740D32B911.or_port 443
+6A7551EEE18F78A9813096E82BF84F740D32B911.dir_port 80
+6A7551EEE18F78A9813096E82BF84F740D32B911.nickname TorMachine
+6A7551EEE18F78A9813096E82BF84F740D32B911.has_extrainfo false
+6A7551EEE18F78A9813096E82BF84F740D32B911.orport6_address 2a01:4f8:1c0c:45f7::1
+6A7551EEE18F78A9813096E82BF84F740D32B911.orport6_port 443
6EF897645B79B6CB35E853B32506375014DE3621.address 80.127.137.19
6EF897645B79B6CB35E853B32506375014DE3621.or_port 443
6EF897645B79B6CB35E853B32506375014DE3621.dir_port 80
@@ -362,36 +313,59 @@ header.type fallback
70C55A114C0EF3DC5784A4FAEE64388434A3398F.dir_port 80
70C55A114C0EF3DC5784A4FAEE64388434A3398F.nickname torpidsFRplusserver
70C55A114C0EF3DC5784A4FAEE64388434A3398F.has_extrainfo false
-71CFDEB4D9E00CCC3E31EC4E8A29E109BBC1FB36.address 185.220.101.30
-71CFDEB4D9E00CCC3E31EC4E8A29E109BBC1FB36.or_port 20030
-71CFDEB4D9E00CCC3E31EC4E8A29E109BBC1FB36.dir_port 10030
-71CFDEB4D9E00CCC3E31EC4E8A29E109BBC1FB36.nickname niftypedetidae
-71CFDEB4D9E00CCC3E31EC4E8A29E109BBC1FB36.has_extrainfo false
72B2B12A3F60408BDBC98C6DF53988D3A0B3F0EE.address 85.235.250.88
72B2B12A3F60408BDBC98C6DF53988D3A0B3F0EE.or_port 443
72B2B12A3F60408BDBC98C6DF53988D3A0B3F0EE.dir_port 80
72B2B12A3F60408BDBC98C6DF53988D3A0B3F0EE.nickname TykRelay01
72B2B12A3F60408BDBC98C6DF53988D3A0B3F0EE.has_extrainfo false
-7600680249A22080ECC6173FBBF64D6FCF330A61.address 81.7.14.31
-7600680249A22080ECC6173FBBF64D6FCF330A61.or_port 443
-7600680249A22080ECC6173FBBF64D6FCF330A61.dir_port 9001
-7600680249A22080ECC6173FBBF64D6FCF330A61.nickname Ichotolot62
-7600680249A22080ECC6173FBBF64D6FCF330A61.has_extrainfo true
+72B2B12A3F60408BDBC98C6DF53988D3A0B3F0EE.orport6_address 2a01:3a0:1:1900:85:235:250:88
+72B2B12A3F60408BDBC98C6DF53988D3A0B3F0EE.orport6_port 443
+742C45F2D9004AADE0077E528A4418A6A81BC2BA.address 178.17.170.23
+742C45F2D9004AADE0077E528A4418A6A81BC2BA.or_port 9001
+742C45F2D9004AADE0077E528A4418A6A81BC2BA.dir_port 9030
+742C45F2D9004AADE0077E528A4418A6A81BC2BA.nickname TorExitMoldova2
+742C45F2D9004AADE0077E528A4418A6A81BC2BA.has_extrainfo false
+742C45F2D9004AADE0077E528A4418A6A81BC2BA.orport6_address 2a00:1dc0:caff:7d::8254
+742C45F2D9004AADE0077E528A4418A6A81BC2BA.orport6_port 9001
+745369332749021C6FAF100D327BC3BF1DF4707B.address 50.7.74.173
+745369332749021C6FAF100D327BC3BF1DF4707B.or_port 9001
+745369332749021C6FAF100D327BC3BF1DF4707B.dir_port 9030
+745369332749021C6FAF100D327BC3BF1DF4707B.nickname theia5
+745369332749021C6FAF100D327BC3BF1DF4707B.has_extrainfo false
+745369332749021C6FAF100D327BC3BF1DF4707B.orport6_address 2001:49f0:d002:2::55
+745369332749021C6FAF100D327BC3BF1DF4707B.orport6_port 443
+77131D7E2EC1CA9B8D737502256DA9103599CE51.address 77.247.181.166
+77131D7E2EC1CA9B8D737502256DA9103599CE51.or_port 443
+77131D7E2EC1CA9B8D737502256DA9103599CE51.dir_port 80
+77131D7E2EC1CA9B8D737502256DA9103599CE51.nickname CriticalMass
+77131D7E2EC1CA9B8D737502256DA9103599CE51.has_extrainfo false
775B0FAFDE71AADC23FFC8782B7BEB1D5A92733E.address 5.196.23.64
775B0FAFDE71AADC23FFC8782B7BEB1D5A92733E.or_port 9001
775B0FAFDE71AADC23FFC8782B7BEB1D5A92733E.dir_port 9030
775B0FAFDE71AADC23FFC8782B7BEB1D5A92733E.nickname Aerodynamik01
775B0FAFDE71AADC23FFC8782B7BEB1D5A92733E.has_extrainfo false
+79509683AB4C8DDAF90A120C69A4179C6CD5A387.address 185.244.193.141
+79509683AB4C8DDAF90A120C69A4179C6CD5A387.or_port 9001
+79509683AB4C8DDAF90A120C69A4179C6CD5A387.dir_port 9030
+79509683AB4C8DDAF90A120C69A4179C6CD5A387.nickname DerDickeReloaded
+79509683AB4C8DDAF90A120C69A4179C6CD5A387.has_extrainfo false
+79509683AB4C8DDAF90A120C69A4179C6CD5A387.orport6_address 2a03:4000:27:192:24:12:1984:4
+79509683AB4C8DDAF90A120C69A4179C6CD5A387.orport6_port 9001
7BB70F8585DFC27E75D692970C0EEB0F22983A63.address 51.254.136.195
7BB70F8585DFC27E75D692970C0EEB0F22983A63.or_port 443
7BB70F8585DFC27E75D692970C0EEB0F22983A63.dir_port 80
7BB70F8585DFC27E75D692970C0EEB0F22983A63.nickname torproxy02
7BB70F8585DFC27E75D692970C0EEB0F22983A63.has_extrainfo false
-7D05A38E39FC5D29AFE6BE487B9B4DC9E635D09E.address 185.100.84.82
-7D05A38E39FC5D29AFE6BE487B9B4DC9E635D09E.or_port 443
-7D05A38E39FC5D29AFE6BE487B9B4DC9E635D09E.dir_port 80
-7D05A38E39FC5D29AFE6BE487B9B4DC9E635D09E.nickname saveyourprivacyexit
-7D05A38E39FC5D29AFE6BE487B9B4DC9E635D09E.has_extrainfo false
+7BFB908A3AA5B491DA4CA72CCBEE0E1F2A939B55.address 77.247.181.162
+7BFB908A3AA5B491DA4CA72CCBEE0E1F2A939B55.or_port 443
+7BFB908A3AA5B491DA4CA72CCBEE0E1F2A939B55.dir_port 80
+7BFB908A3AA5B491DA4CA72CCBEE0E1F2A939B55.nickname sofia
+7BFB908A3AA5B491DA4CA72CCBEE0E1F2A939B55.has_extrainfo false
+7E281CD2C315C4F7A84BC7C8721C3BC974DDBFA3.address 185.220.101.48
+7E281CD2C315C4F7A84BC7C8721C3BC974DDBFA3.or_port 20048
+7E281CD2C315C4F7A84BC7C8721C3BC974DDBFA3.dir_port 10048
+7E281CD2C315C4F7A84BC7C8721C3BC974DDBFA3.nickname niftyporcupine
+7E281CD2C315C4F7A84BC7C8721C3BC974DDBFA3.has_extrainfo false
80AAF8D5956A43C197104CEF2550CD42D165C6FB.address 193.11.114.45
80AAF8D5956A43C197104CEF2550CD42D165C6FB.or_port 9002
80AAF8D5956A43C197104CEF2550CD42D165C6FB.dir_port 9031
@@ -404,13 +378,6 @@ header.type fallback
8101421BEFCCF4C271D5483C5AABCAAD245BBB9D.has_extrainfo false
8101421BEFCCF4C271D5483C5AABCAAD245BBB9D.orport6_address 2001:41d0:401:3100::30dc
8101421BEFCCF4C271D5483C5AABCAAD245BBB9D.orport6_port 9001
-81AFA888F8F8F4A024AB58ECA0ADDEBB93FF01DA.address 217.12.199.190
-81AFA888F8F8F4A024AB58ECA0ADDEBB93FF01DA.or_port 443
-81AFA888F8F8F4A024AB58ECA0ADDEBB93FF01DA.dir_port 80
-81AFA888F8F8F4A024AB58ECA0ADDEBB93FF01DA.nickname torpidsUAitlas
-81AFA888F8F8F4A024AB58ECA0ADDEBB93FF01DA.has_extrainfo false
-81AFA888F8F8F4A024AB58ECA0ADDEBB93FF01DA.orport6_address 2a02:27a8:0:2::486
-81AFA888F8F8F4A024AB58ECA0ADDEBB93FF01DA.orport6_port 993
81B75D534F91BFB7C57AB67DA10BCEF622582AE8.address 192.42.116.16
81B75D534F91BFB7C57AB67DA10BCEF622582AE8.or_port 443
81B75D534F91BFB7C57AB67DA10BCEF622582AE8.dir_port 80
@@ -435,23 +402,23 @@ header.type fallback
8456DFA94161CDD99E480C2A2992C366C6564410.dir_port 80
8456DFA94161CDD99E480C2A2992C366C6564410.nickname turingmachine
8456DFA94161CDD99E480C2A2992C366C6564410.has_extrainfo false
+855BC2DABE24C861CD887DB9B2E950424B49FC34.address 85.230.178.139
+855BC2DABE24C861CD887DB9B2E950424B49FC34.or_port 443
+855BC2DABE24C861CD887DB9B2E950424B49FC34.dir_port 9030
+855BC2DABE24C861CD887DB9B2E950424B49FC34.nickname Logforme
+855BC2DABE24C861CD887DB9B2E950424B49FC34.has_extrainfo false
+85A885433E50B1874F11CEC9BE98451E24660976.address 178.254.7.88
+85A885433E50B1874F11CEC9BE98451E24660976.or_port 8443
+85A885433E50B1874F11CEC9BE98451E24660976.dir_port 8080
+85A885433E50B1874F11CEC9BE98451E24660976.nickname wr3ck3d0ni0n01
+85A885433E50B1874F11CEC9BE98451E24660976.has_extrainfo false
86C281AD135058238D7A337D546C902BE8505DDE.address 185.96.88.29
86C281AD135058238D7A337D546C902BE8505DDE.or_port 443
86C281AD135058238D7A337D546C902BE8505DDE.dir_port 80
86C281AD135058238D7A337D546C902BE8505DDE.nickname TykRelay05
86C281AD135058238D7A337D546C902BE8505DDE.has_extrainfo false
-8844D87E9B038BE3270938F05AF797E1D3C74C0F.address 93.180.156.84
-8844D87E9B038BE3270938F05AF797E1D3C74C0F.or_port 9001
-8844D87E9B038BE3270938F05AF797E1D3C74C0F.dir_port 9030
-8844D87E9B038BE3270938F05AF797E1D3C74C0F.nickname BARACUDA
-8844D87E9B038BE3270938F05AF797E1D3C74C0F.has_extrainfo false
-8B6556601612F1E2AFCE2A12FFFAF8482A76DD1F.address 51.15.205.214
-8B6556601612F1E2AFCE2A12FFFAF8482A76DD1F.or_port 9001
-8B6556601612F1E2AFCE2A12FFFAF8482A76DD1F.dir_port 9030
-8B6556601612F1E2AFCE2A12FFFAF8482A76DD1F.nickname titania1
-8B6556601612F1E2AFCE2A12FFFAF8482A76DD1F.has_extrainfo false
-8B6556601612F1E2AFCE2A12FFFAF8482A76DD1F.orport6_address 2001:bc8:4400:2500::5:b07
-8B6556601612F1E2AFCE2A12FFFAF8482A76DD1F.orport6_port 9001
+86C281AD135058238D7A337D546C902BE8505DDE.orport6_address 2a00:4020::185:96:88:29
+86C281AD135058238D7A337D546C902BE8505DDE.orport6_port 443
8C00FA7369A7A308F6A137600F0FA07990D9D451.address 163.172.194.53
8C00FA7369A7A308F6A137600F0FA07990D9D451.or_port 9001
8C00FA7369A7A308F6A137600F0FA07990D9D451.dir_port 9030
@@ -459,11 +426,23 @@ header.type fallback
8C00FA7369A7A308F6A137600F0FA07990D9D451.has_extrainfo false
8C00FA7369A7A308F6A137600F0FA07990D9D451.orport6_address 2001:bc8:225f:142:6c69:7461:7669:73
8C00FA7369A7A308F6A137600F0FA07990D9D451.orport6_port 9001
+8D79F73DCD91FC4F5017422FAC70074D6DB8DD81.address 5.189.169.190
+8D79F73DCD91FC4F5017422FAC70074D6DB8DD81.or_port 8080
+8D79F73DCD91FC4F5017422FAC70074D6DB8DD81.dir_port 8030
+8D79F73DCD91FC4F5017422FAC70074D6DB8DD81.nickname thanatosDE
+8D79F73DCD91FC4F5017422FAC70074D6DB8DD81.has_extrainfo false
8FA37B93397015B2BC5A525C908485260BE9F422.address 81.7.11.96
8FA37B93397015B2BC5A525C908485260BE9F422.or_port 9001
8FA37B93397015B2BC5A525C908485260BE9F422.dir_port 9030
8FA37B93397015B2BC5A525C908485260BE9F422.nickname Doedel22
8FA37B93397015B2BC5A525C908485260BE9F422.has_extrainfo false
+90A5D1355C4B5840E950EB61E673863A6AE3ACA1.address 54.37.139.118
+90A5D1355C4B5840E950EB61E673863A6AE3ACA1.or_port 9001
+90A5D1355C4B5840E950EB61E673863A6AE3ACA1.dir_port 9030
+90A5D1355C4B5840E950EB61E673863A6AE3ACA1.nickname rofltor09
+90A5D1355C4B5840E950EB61E673863A6AE3ACA1.has_extrainfo false
+90A5D1355C4B5840E950EB61E673863A6AE3ACA1.orport6_address 2001:41d0:601:1100::1b8
+90A5D1355C4B5840E950EB61E673863A6AE3ACA1.orport6_port 9001
91D23D8A539B83D2FB56AA67ECD4D75CC093AC55.address 37.187.20.59
91D23D8A539B83D2FB56AA67ECD4D75CC093AC55.or_port 443
91D23D8A539B83D2FB56AA67ECD4D75CC093AC55.dir_port 80
@@ -471,28 +450,28 @@ header.type fallback
91D23D8A539B83D2FB56AA67ECD4D75CC093AC55.has_extrainfo false
91D23D8A539B83D2FB56AA67ECD4D75CC093AC55.orport6_address 2001:41d0:a:143b::1
91D23D8A539B83D2FB56AA67ECD4D75CC093AC55.orport6_port 993
-9231DF741915AA1630031A93026D88726877E93A.address 51.255.41.65
-9231DF741915AA1630031A93026D88726877E93A.or_port 9001
-9231DF741915AA1630031A93026D88726877E93A.dir_port 9030
-9231DF741915AA1630031A93026D88726877E93A.nickname PrisnCellRelayFR1
-9231DF741915AA1630031A93026D88726877E93A.has_extrainfo false
-92412EA1B9AA887D462B51D816777002F4D58907.address 54.37.73.111
-92412EA1B9AA887D462B51D816777002F4D58907.or_port 9001
-92412EA1B9AA887D462B51D816777002F4D58907.dir_port 9030
-92412EA1B9AA887D462B51D816777002F4D58907.nickname Aerodynamik05
-92412EA1B9AA887D462B51D816777002F4D58907.has_extrainfo false
+91E4015E1F82DAF0121D62267E54A1F661AB6DC7.address 173.255.245.116
+91E4015E1F82DAF0121D62267E54A1F661AB6DC7.or_port 9001
+91E4015E1F82DAF0121D62267E54A1F661AB6DC7.dir_port 9030
+91E4015E1F82DAF0121D62267E54A1F661AB6DC7.nickname IWorshipHisShadow
+91E4015E1F82DAF0121D62267E54A1F661AB6DC7.has_extrainfo false
924B24AFA7F075D059E8EEB284CC400B33D3D036.address 96.253.78.108
924B24AFA7F075D059E8EEB284CC400B33D3D036.or_port 443
924B24AFA7F075D059E8EEB284CC400B33D3D036.dir_port 80
924B24AFA7F075D059E8EEB284CC400B33D3D036.nickname NSDFreedom
924B24AFA7F075D059E8EEB284CC400B33D3D036.has_extrainfo false
-92CFD9565B24646CAC2D172D3DB503D69E777B8A.address 193.234.15.57
-92CFD9565B24646CAC2D172D3DB503D69E777B8A.or_port 443
-92CFD9565B24646CAC2D172D3DB503D69E777B8A.dir_port 80
-92CFD9565B24646CAC2D172D3DB503D69E777B8A.nickname bakunin
-92CFD9565B24646CAC2D172D3DB503D69E777B8A.has_extrainfo false
-92CFD9565B24646CAC2D172D3DB503D69E777B8A.orport6_address 2a00:1c20:4089:1234:7825:2c5d:1ecd:c66f
-92CFD9565B24646CAC2D172D3DB503D69E777B8A.orport6_port 443
+9288B75B5FF8861EFF32A6BE8825CC38A4F9F8C2.address 92.38.163.21
+9288B75B5FF8861EFF32A6BE8825CC38A4F9F8C2.or_port 443
+9288B75B5FF8861EFF32A6BE8825CC38A4F9F8C2.dir_port 9030
+9288B75B5FF8861EFF32A6BE8825CC38A4F9F8C2.nickname angeltest9
+9288B75B5FF8861EFF32A6BE8825CC38A4F9F8C2.has_extrainfo false
+935F589545B8A271A722E330445BB99F67DBB058.address 163.172.53.84
+935F589545B8A271A722E330445BB99F67DBB058.or_port 443
+935F589545B8A271A722E330445BB99F67DBB058.dir_port 80
+935F589545B8A271A722E330445BB99F67DBB058.nickname Multivac0
+935F589545B8A271A722E330445BB99F67DBB058.has_extrainfo false
+935F589545B8A271A722E330445BB99F67DBB058.orport6_address 2001:bc8:24f8::
+935F589545B8A271A722E330445BB99F67DBB058.orport6_port 443
94C4B7B8C50C86A92B6A20107539EE2678CF9A28.address 204.8.156.142
94C4B7B8C50C86A92B6A20107539EE2678CF9A28.or_port 443
94C4B7B8C50C86A92B6A20107539EE2678CF9A28.dir_port 80
@@ -508,18 +487,6 @@ header.type fallback
99E246DB480B313A3012BC3363093CC26CD209C7.dir_port 31336
99E246DB480B313A3012BC3363093CC26CD209C7.nickname ViDiSrv
99E246DB480B313A3012BC3363093CC26CD209C7.has_extrainfo false
-9A0D54D3A6D2E0767596BF1515E6162A75B3293F.address 91.229.20.27
-9A0D54D3A6D2E0767596BF1515E6162A75B3293F.or_port 9001
-9A0D54D3A6D2E0767596BF1515E6162A75B3293F.dir_port 9030
-9A0D54D3A6D2E0767596BF1515E6162A75B3293F.nickname gordonkeybag
-9A0D54D3A6D2E0767596BF1515E6162A75B3293F.has_extrainfo false
-9A68B85A02318F4E7E87F2828039FBD5D75B0142.address 66.111.2.20
-9A68B85A02318F4E7E87F2828039FBD5D75B0142.or_port 9001
-9A68B85A02318F4E7E87F2828039FBD5D75B0142.dir_port 9030
-9A68B85A02318F4E7E87F2828039FBD5D75B0142.nickname NYCBUG0
-9A68B85A02318F4E7E87F2828039FBD5D75B0142.has_extrainfo false
-9A68B85A02318F4E7E87F2828039FBD5D75B0142.orport6_address 2610:1c0:0:5::20
-9A68B85A02318F4E7E87F2828039FBD5D75B0142.orport6_port 9001
9B31F1F1C1554F9FFB3455911F82E818EF7C7883.address 185.100.86.128
9B31F1F1C1554F9FFB3455911F82E818EF7C7883.or_port 9001
9B31F1F1C1554F9FFB3455911F82E818EF7C7883.dir_port 9030
@@ -527,6 +494,11 @@ header.type fallback
9B31F1F1C1554F9FFB3455911F82E818EF7C7883.has_extrainfo false
9B31F1F1C1554F9FFB3455911F82E818EF7C7883.orport6_address 2a06:1700:1::11
9B31F1F1C1554F9FFB3455911F82E818EF7C7883.orport6_port 9001
+9B816A5B3EB20B8E4E9B9D1FBA299BD3F40F0320.address 185.220.101.49
+9B816A5B3EB20B8E4E9B9D1FBA299BD3F40F0320.or_port 20049
+9B816A5B3EB20B8E4E9B9D1FBA299BD3F40F0320.dir_port 10049
+9B816A5B3EB20B8E4E9B9D1FBA299BD3F40F0320.nickname niftypygmyjerboa
+9B816A5B3EB20B8E4E9B9D1FBA299BD3F40F0320.has_extrainfo false
9C900A7F6F5DD034CFFD192DAEC9CCAA813DB022.address 86.105.212.130
9C900A7F6F5DD034CFFD192DAEC9CCAA813DB022.or_port 443
9C900A7F6F5DD034CFFD192DAEC9CCAA813DB022.dir_port 9030
@@ -547,63 +519,31 @@ A0F06C2FADF88D3A39AA3072B406F09D7095AC9E.or_port 443
A0F06C2FADF88D3A39AA3072B406F09D7095AC9E.dir_port 80
A0F06C2FADF88D3A39AA3072B406F09D7095AC9E.nickname Dhalgren
A0F06C2FADF88D3A39AA3072B406F09D7095AC9E.has_extrainfo true
-A10C4F666D27364036B562823E5830BC448E046A.address 171.25.193.77
-A10C4F666D27364036B562823E5830BC448E046A.or_port 443
-A10C4F666D27364036B562823E5830BC448E046A.dir_port 80
-A10C4F666D27364036B562823E5830BC448E046A.nickname DFRI1
-A10C4F666D27364036B562823E5830BC448E046A.has_extrainfo false
-A10C4F666D27364036B562823E5830BC448E046A.orport6_address 2001:67c:289c:3::77
-A10C4F666D27364036B562823E5830BC448E046A.orport6_port 443
-A2A6616723B511D8E068BB71705191763191F6B2.address 87.118.122.120
-A2A6616723B511D8E068BB71705191763191F6B2.or_port 443
-A2A6616723B511D8E068BB71705191763191F6B2.dir_port 80
-A2A6616723B511D8E068BB71705191763191F6B2.nickname otheontelth
-A2A6616723B511D8E068BB71705191763191F6B2.has_extrainfo false
A2E6BB5C391CD46B38C55B4329C35304540771F1.address 81.7.3.67
A2E6BB5C391CD46B38C55B4329C35304540771F1.or_port 443
A2E6BB5C391CD46B38C55B4329C35304540771F1.dir_port 993
A2E6BB5C391CD46B38C55B4329C35304540771F1.nickname BeastieJoy62
A2E6BB5C391CD46B38C55B4329C35304540771F1.has_extrainfo true
-A478E421F83194C114F41E94F95999672AED51FE.address 171.25.193.78
-A478E421F83194C114F41E94F95999672AED51FE.or_port 443
-A478E421F83194C114F41E94F95999672AED51FE.dir_port 80
-A478E421F83194C114F41E94F95999672AED51FE.nickname DFRI4
-A478E421F83194C114F41E94F95999672AED51FE.has_extrainfo false
-A478E421F83194C114F41E94F95999672AED51FE.orport6_address 2001:67c:289c:3::78
-A478E421F83194C114F41E94F95999672AED51FE.orport6_port 443
-A4C98CEA3F34E05299417E9F885A642C88EF6029.address 193.234.15.58
-A4C98CEA3F34E05299417E9F885A642C88EF6029.or_port 443
-A4C98CEA3F34E05299417E9F885A642C88EF6029.dir_port 80
-A4C98CEA3F34E05299417E9F885A642C88EF6029.nickname jaures2
-A4C98CEA3F34E05299417E9F885A642C88EF6029.has_extrainfo false
-A4C98CEA3F34E05299417E9F885A642C88EF6029.orport6_address 2a00:1c20:4089:1234:cdae:1b3e:cc38:3d45
-A4C98CEA3F34E05299417E9F885A642C88EF6029.orport6_port 443
A53C46F5B157DD83366D45A8E99A244934A14C46.address 128.31.0.13
A53C46F5B157DD83366D45A8E99A244934A14C46.or_port 443
A53C46F5B157DD83366D45A8E99A244934A14C46.dir_port 80
A53C46F5B157DD83366D45A8E99A244934A14C46.nickname csailmitexit
A53C46F5B157DD83366D45A8E99A244934A14C46.has_extrainfo false
-AA0D167E03E298F9A8CD50F448B81FBD7FA80D56.address 94.142.242.84
-AA0D167E03E298F9A8CD50F448B81FBD7FA80D56.or_port 443
-AA0D167E03E298F9A8CD50F448B81FBD7FA80D56.dir_port 80
-AA0D167E03E298F9A8CD50F448B81FBD7FA80D56.nickname rejozenger
-AA0D167E03E298F9A8CD50F448B81FBD7FA80D56.has_extrainfo false
-AA0D167E03E298F9A8CD50F448B81FBD7FA80D56.orport6_address 2a02:898:24:84::1
-AA0D167E03E298F9A8CD50F448B81FBD7FA80D56.orport6_port 443
-AC66FFA4AB35A59EBBF5BF4C70008BF24D8A7A5C.address 195.154.164.243
-AC66FFA4AB35A59EBBF5BF4C70008BF24D8A7A5C.or_port 443
-AC66FFA4AB35A59EBBF5BF4C70008BF24D8A7A5C.dir_port 80
-AC66FFA4AB35A59EBBF5BF4C70008BF24D8A7A5C.nickname torpidsFRonline3
-AC66FFA4AB35A59EBBF5BF4C70008BF24D8A7A5C.has_extrainfo false
-AC66FFA4AB35A59EBBF5BF4C70008BF24D8A7A5C.orport6_address 2001:bc8:399f:f000::1
-AC66FFA4AB35A59EBBF5BF4C70008BF24D8A7A5C.orport6_port 993
-ACD889D86E02EDDAB1AFD81F598C0936238DC6D0.address 86.59.119.88
-ACD889D86E02EDDAB1AFD81F598C0936238DC6D0.or_port 443
-ACD889D86E02EDDAB1AFD81F598C0936238DC6D0.dir_port 80
-ACD889D86E02EDDAB1AFD81F598C0936238DC6D0.nickname ph3x
-ACD889D86E02EDDAB1AFD81F598C0936238DC6D0.has_extrainfo false
-ACD889D86E02EDDAB1AFD81F598C0936238DC6D0.orport6_address 2001:858:2:30:86:59:119:88
-ACD889D86E02EDDAB1AFD81F598C0936238DC6D0.orport6_port 443
+A86EC24F5B8B964F67AC7C27CE92842025983274.address 185.246.152.22
+A86EC24F5B8B964F67AC7C27CE92842025983274.or_port 443
+A86EC24F5B8B964F67AC7C27CE92842025983274.dir_port 9030
+A86EC24F5B8B964F67AC7C27CE92842025983274.nickname angeltest19
+A86EC24F5B8B964F67AC7C27CE92842025983274.has_extrainfo false
+A9406A006D6E7B5DA30F2C6D4E42A338B5E340B2.address 163.172.149.122
+A9406A006D6E7B5DA30F2C6D4E42A338B5E340B2.or_port 443
+A9406A006D6E7B5DA30F2C6D4E42A338B5E340B2.dir_port 80
+A9406A006D6E7B5DA30F2C6D4E42A338B5E340B2.nickname niij03
+A9406A006D6E7B5DA30F2C6D4E42A338B5E340B2.has_extrainfo false
+AC2BEDD0BAC72838EA7E6F113F856C4E8018ACDB.address 176.10.107.180
+AC2BEDD0BAC72838EA7E6F113F856C4E8018ACDB.or_port 9001
+AC2BEDD0BAC72838EA7E6F113F856C4E8018ACDB.dir_port 9030
+AC2BEDD0BAC72838EA7E6F113F856C4E8018ACDB.nickname schokomilch
+AC2BEDD0BAC72838EA7E6F113F856C4E8018ACDB.has_extrainfo false
ACDD9E85A05B127BA010466C13C8C47212E8A38F.address 185.129.62.62
ACDD9E85A05B127BA010466C13C8C47212E8A38F.or_port 9001
ACDD9E85A05B127BA010466C13C8C47212E8A38F.dir_port 9030
@@ -611,13 +551,6 @@ ACDD9E85A05B127BA010466C13C8C47212E8A38F.nickname kramse
ACDD9E85A05B127BA010466C13C8C47212E8A38F.has_extrainfo false
ACDD9E85A05B127BA010466C13C8C47212E8A38F.orport6_address 2a06:d380:0:3700::62
ACDD9E85A05B127BA010466C13C8C47212E8A38F.orport6_port 9001
-AD19490C7DBB26D3A68EFC824F67E69B0A96E601.address 188.40.128.246
-AD19490C7DBB26D3A68EFC824F67E69B0A96E601.or_port 9001
-AD19490C7DBB26D3A68EFC824F67E69B0A96E601.dir_port 9030
-AD19490C7DBB26D3A68EFC824F67E69B0A96E601.nickname sputnik
-AD19490C7DBB26D3A68EFC824F67E69B0A96E601.has_extrainfo false
-AD19490C7DBB26D3A68EFC824F67E69B0A96E601.orport6_address 2a01:4f8:221:1ac1:dead:beef:7005:9001
-AD19490C7DBB26D3A68EFC824F67E69B0A96E601.orport6_port 9001
ADB2C26629643DBB9F8FE0096E7D16F9414B4F8D.address 31.185.104.20
ADB2C26629643DBB9F8FE0096E7D16F9414B4F8D.or_port 443
ADB2C26629643DBB9F8FE0096E7D16F9414B4F8D.dir_port 80
@@ -649,35 +582,33 @@ B143D439B72D239A419F8DCE07B8A8EB1B486FA7.or_port 443
B143D439B72D239A419F8DCE07B8A8EB1B486FA7.dir_port 80
B143D439B72D239A419F8DCE07B8A8EB1B486FA7.nickname wardsback
B143D439B72D239A419F8DCE07B8A8EB1B486FA7.has_extrainfo false
+B2197C23A4FF5D1C49EE45BA7688BA8BCCD89A0B.address 199.249.230.64
+B2197C23A4FF5D1C49EE45BA7688BA8BCCD89A0B.or_port 443
+B2197C23A4FF5D1C49EE45BA7688BA8BCCD89A0B.dir_port 80
+B2197C23A4FF5D1C49EE45BA7688BA8BCCD89A0B.nickname Quintex41
+B2197C23A4FF5D1C49EE45BA7688BA8BCCD89A0B.has_extrainfo false
+B2197C23A4FF5D1C49EE45BA7688BA8BCCD89A0B.orport6_address 2620:7:6001::ffff:c759:e640
+B2197C23A4FF5D1C49EE45BA7688BA8BCCD89A0B.orport6_port 80
B291D30517D23299AD7CEE3E60DFE60D0E3A4664.address 136.243.214.137
B291D30517D23299AD7CEE3E60DFE60D0E3A4664.or_port 443
B291D30517D23299AD7CEE3E60DFE60D0E3A4664.dir_port 80
B291D30517D23299AD7CEE3E60DFE60D0E3A4664.nickname TorKIT
B291D30517D23299AD7CEE3E60DFE60D0E3A4664.has_extrainfo false
-B44FBE5366AD98B46D829754FA4AC599BAE41A6A.address 193.234.15.60
-B44FBE5366AD98B46D829754FA4AC599BAE41A6A.or_port 443
-B44FBE5366AD98B46D829754FA4AC599BAE41A6A.dir_port 80
-B44FBE5366AD98B46D829754FA4AC599BAE41A6A.nickname jaures3
-B44FBE5366AD98B46D829754FA4AC599BAE41A6A.has_extrainfo false
-B44FBE5366AD98B46D829754FA4AC599BAE41A6A.orport6_address 2a00:1c20:4089:1234:67bc:79f3:61c0:6e49
-B44FBE5366AD98B46D829754FA4AC599BAE41A6A.orport6_port 443
+B4CAFD9CBFB34EC5DAAC146920DC7DFAFE91EA20.address 212.47.233.86
+B4CAFD9CBFB34EC5DAAC146920DC7DFAFE91EA20.or_port 9001
+B4CAFD9CBFB34EC5DAAC146920DC7DFAFE91EA20.dir_port 9030
+B4CAFD9CBFB34EC5DAAC146920DC7DFAFE91EA20.nickname netimanmu
+B4CAFD9CBFB34EC5DAAC146920DC7DFAFE91EA20.has_extrainfo false
B5212DB685A2A0FCFBAE425738E478D12361710D.address 93.115.97.242
B5212DB685A2A0FCFBAE425738E478D12361710D.or_port 9001
B5212DB685A2A0FCFBAE425738E478D12361710D.dir_port 9030
B5212DB685A2A0FCFBAE425738E478D12361710D.nickname firstor
B5212DB685A2A0FCFBAE425738E478D12361710D.has_extrainfo false
-B6904ADD4C0D10CDA7179E051962350A69A63243.address 81.2.209.10
-B6904ADD4C0D10CDA7179E051962350A69A63243.or_port 80
-B6904ADD4C0D10CDA7179E051962350A69A63243.dir_port 443
-B6904ADD4C0D10CDA7179E051962350A69A63243.nickname torzabehlice
-B6904ADD4C0D10CDA7179E051962350A69A63243.has_extrainfo false
-B6904ADD4C0D10CDA7179E051962350A69A63243.orport6_address 2001:15e8:201:1::d10a
-B6904ADD4C0D10CDA7179E051962350A69A63243.orport6_port 80
-B771AA877687F88E6F1CA5354756DF6C8A7B6B24.address 185.220.101.32
-B771AA877687F88E6F1CA5354756DF6C8A7B6B24.or_port 20032
-B771AA877687F88E6F1CA5354756DF6C8A7B6B24.dir_port 10032
-B771AA877687F88E6F1CA5354756DF6C8A7B6B24.nickname niftypika
-B771AA877687F88E6F1CA5354756DF6C8A7B6B24.has_extrainfo false
+B57A87009FA838471FB2227DDE68165AB2A2FCC4.address 51.38.134.104
+B57A87009FA838471FB2227DDE68165AB2A2FCC4.or_port 443
+B57A87009FA838471FB2227DDE68165AB2A2FCC4.dir_port 9030
+B57A87009FA838471FB2227DDE68165AB2A2FCC4.nickname angeltest5
+B57A87009FA838471FB2227DDE68165AB2A2FCC4.has_extrainfo false
B83DC1558F0D34353BB992EF93AFEAFDB226A73E.address 193.11.114.46
B83DC1558F0D34353BB992EF93AFEAFDB226A73E.or_port 9003
B83DC1558F0D34353BB992EF93AFEAFDB226A73E.dir_port 9032
@@ -695,6 +626,23 @@ B86137AE9681701901C6720E55C16805B46BD8E3.or_port 443
B86137AE9681701901C6720E55C16805B46BD8E3.dir_port 1080
B86137AE9681701901C6720E55C16805B46BD8E3.nickname BeastieJoy60
B86137AE9681701901C6720E55C16805B46BD8E3.has_extrainfo true
+BB60F5BA113A0B8B44B7B37DE3567FE561E92F78.address 51.15.179.153
+BB60F5BA113A0B8B44B7B37DE3567FE561E92F78.or_port 995
+BB60F5BA113A0B8B44B7B37DE3567FE561E92F78.dir_port 110
+BB60F5BA113A0B8B44B7B37DE3567FE561E92F78.nickname Casper04
+BB60F5BA113A0B8B44B7B37DE3567FE561E92F78.has_extrainfo false
+BCEDF6C193AA687AE471B8A22EBF6BC57C2D285E.address 198.96.155.3
+BCEDF6C193AA687AE471B8A22EBF6BC57C2D285E.or_port 5001
+BCEDF6C193AA687AE471B8A22EBF6BC57C2D285E.dir_port 8080
+BCEDF6C193AA687AE471B8A22EBF6BC57C2D285E.nickname gurgle
+BCEDF6C193AA687AE471B8A22EBF6BC57C2D285E.has_extrainfo false
+BCEF908195805E03E92CCFE669C48738E556B9C5.address 128.199.55.207
+BCEF908195805E03E92CCFE669C48738E556B9C5.or_port 9001
+BCEF908195805E03E92CCFE669C48738E556B9C5.dir_port 9030
+BCEF908195805E03E92CCFE669C48738E556B9C5.nickname EldritchReaper
+BCEF908195805E03E92CCFE669C48738E556B9C5.has_extrainfo false
+BCEF908195805E03E92CCFE669C48738E556B9C5.orport6_address 2a03:b0c0:2:d0::158:3001
+BCEF908195805E03E92CCFE669C48738E556B9C5.orport6_port 9001
BD552C165E2ED2887D3F1CCE9CFF155DDA2D86E6.address 213.141.138.174
BD552C165E2ED2887D3F1CCE9CFF155DDA2D86E6.or_port 9001
BD552C165E2ED2887D3F1CCE9CFF155DDA2D86E6.dir_port 9030
@@ -707,11 +655,13 @@ BF0FB582E37F738CD33C3651125F2772705BB8E8.nickname quadhead
BF0FB582E37F738CD33C3651125F2772705BB8E8.has_extrainfo false
BF0FB582E37F738CD33C3651125F2772705BB8E8.orport6_address 2a01:4f8:211:c68::2
BF0FB582E37F738CD33C3651125F2772705BB8E8.orport6_port 9010
-BF735F669481EE1CCC348F0731551C933D1E2278.address 104.192.5.248
-BF735F669481EE1CCC348F0731551C933D1E2278.or_port 443
+BF735F669481EE1CCC348F0731551C933D1E2278.address 212.47.233.250
+BF735F669481EE1CCC348F0731551C933D1E2278.or_port 9001
BF735F669481EE1CCC348F0731551C933D1E2278.dir_port 9030
-BF735F669481EE1CCC348F0731551C933D1E2278.nickname Freeway1a1
+BF735F669481EE1CCC348F0731551C933D1E2278.nickname FreewaySca
BF735F669481EE1CCC348F0731551C933D1E2278.has_extrainfo false
+BF735F669481EE1CCC348F0731551C933D1E2278.orport6_address 2001:bc8:4400:2b00::1c:629
+BF735F669481EE1CCC348F0731551C933D1E2278.orport6_port 9001
C0192FF43E777250084175F4E59AC1BA2290CE38.address 192.160.102.169
C0192FF43E777250084175F4E59AC1BA2290CE38.or_port 9001
C0192FF43E777250084175F4E59AC1BA2290CE38.dir_port 80
@@ -719,35 +669,23 @@ C0192FF43E777250084175F4E59AC1BA2290CE38.nickname manipogo
C0192FF43E777250084175F4E59AC1BA2290CE38.has_extrainfo false
C0192FF43E777250084175F4E59AC1BA2290CE38.orport6_address 2620:132:300c:c01d::9
C0192FF43E777250084175F4E59AC1BA2290CE38.orport6_port 9002
-C08DE49658E5B3CFC6F2A952B453C4B608C9A16A.address 185.220.101.6
-C08DE49658E5B3CFC6F2A952B453C4B608C9A16A.or_port 20006
-C08DE49658E5B3CFC6F2A952B453C4B608C9A16A.dir_port 10006
-C08DE49658E5B3CFC6F2A952B453C4B608C9A16A.nickname niftyvolcanorabbit
-C08DE49658E5B3CFC6F2A952B453C4B608C9A16A.has_extrainfo false
+C0C4F339046EB824999F711D178472FDF53BE7F5.address 132.248.241.5
+C0C4F339046EB824999F711D178472FDF53BE7F5.or_port 9101
+C0C4F339046EB824999F711D178472FDF53BE7F5.dir_port 9130
+C0C4F339046EB824999F711D178472FDF53BE7F5.nickname toritounam2
+C0C4F339046EB824999F711D178472FDF53BE7F5.has_extrainfo false
C2AAB088555850FC434E68943F551072042B85F1.address 31.185.104.21
C2AAB088555850FC434E68943F551072042B85F1.or_port 443
C2AAB088555850FC434E68943F551072042B85F1.dir_port 80
C2AAB088555850FC434E68943F551072042B85F1.nickname Digitalcourage3ip3
C2AAB088555850FC434E68943F551072042B85F1.has_extrainfo false
-C37BC191AC389179674578C3E6944E925FE186C2.address 213.239.217.18
-C37BC191AC389179674578C3E6944E925FE186C2.or_port 1337
-C37BC191AC389179674578C3E6944E925FE186C2.dir_port 1338
-C37BC191AC389179674578C3E6944E925FE186C2.nickname xzdsb
-C37BC191AC389179674578C3E6944E925FE186C2.has_extrainfo false
-C37BC191AC389179674578C3E6944E925FE186C2.orport6_address 2a01:4f8:a0:746a:101:1:1:1
-C37BC191AC389179674578C3E6944E925FE186C2.orport6_port 1337
-C414F28FD2BEC1553024299B31D4E726BEB8E788.address 188.138.112.60
-C414F28FD2BEC1553024299B31D4E726BEB8E788.or_port 1521
-C414F28FD2BEC1553024299B31D4E726BEB8E788.dir_port 1433
-C414F28FD2BEC1553024299B31D4E726BEB8E788.nickname zebra620
-C414F28FD2BEC1553024299B31D4E726BEB8E788.has_extrainfo false
-C4AEA05CF380BAD2230F193E083B8869B4A29937.address 193.234.15.55
-C4AEA05CF380BAD2230F193E083B8869B4A29937.or_port 443
-C4AEA05CF380BAD2230F193E083B8869B4A29937.dir_port 80
-C4AEA05CF380BAD2230F193E083B8869B4A29937.nickname bakunin4
-C4AEA05CF380BAD2230F193E083B8869B4A29937.has_extrainfo false
-C4AEA05CF380BAD2230F193E083B8869B4A29937.orport6_address 2a00:1c20:4089:1234:7b2c:11c5:5221:903e
-C4AEA05CF380BAD2230F193E083B8869B4A29937.orport6_port 443
+C36A434DB54C66E1A97A5653858CE36024352C4D.address 50.7.74.170
+C36A434DB54C66E1A97A5653858CE36024352C4D.or_port 9001
+C36A434DB54C66E1A97A5653858CE36024352C4D.dir_port 9030
+C36A434DB54C66E1A97A5653858CE36024352C4D.nickname theia9
+C36A434DB54C66E1A97A5653858CE36024352C4D.has_extrainfo false
+C36A434DB54C66E1A97A5653858CE36024352C4D.orport6_address 2001:49f0:d002:2::59
+C36A434DB54C66E1A97A5653858CE36024352C4D.orport6_port 443
C793AB88565DDD3C9E4C6F15CCB9D8C7EF964CE9.address 85.248.227.163
C793AB88565DDD3C9E4C6F15CCB9D8C7EF964CE9.or_port 9001
C793AB88565DDD3C9E4C6F15CCB9D8C7EF964CE9.dir_port 443
@@ -767,16 +705,25 @@ CBD0D1BD110EC52963082D839AC6A89D0AE243E7.or_port 9001
CBD0D1BD110EC52963082D839AC6A89D0AE243E7.dir_port 9030
CBD0D1BD110EC52963082D839AC6A89D0AE243E7.nickname UV74S7mjxRcYVrGsAMw
CBD0D1BD110EC52963082D839AC6A89D0AE243E7.has_extrainfo false
-CE47F0356D86CF0A1A2008D97623216D560FB0A8.address 85.25.213.211
-CE47F0356D86CF0A1A2008D97623216D560FB0A8.or_port 80
-CE47F0356D86CF0A1A2008D97623216D560FB0A8.dir_port 465
-CE47F0356D86CF0A1A2008D97623216D560FB0A8.nickname BeastieJoy61
-CE47F0356D86CF0A1A2008D97623216D560FB0A8.has_extrainfo false
-D30E9D4D639068611D6D96861C95C2099140B805.address 46.38.237.221
-D30E9D4D639068611D6D96861C95C2099140B805.or_port 9001
-D30E9D4D639068611D6D96861C95C2099140B805.dir_port 9030
-D30E9D4D639068611D6D96861C95C2099140B805.nickname mine
-D30E9D4D639068611D6D96861C95C2099140B805.has_extrainfo false
+D15AFF44BE641368B958A32FB6B071AC2136B8B1.address 51.254.147.57
+D15AFF44BE641368B958A32FB6B071AC2136B8B1.or_port 443
+D15AFF44BE641368B958A32FB6B071AC2136B8B1.dir_port 80
+D15AFF44BE641368B958A32FB6B071AC2136B8B1.nickname Cosworth01
+D15AFF44BE641368B958A32FB6B071AC2136B8B1.has_extrainfo false
+D1AFBF3117B308B6D1A7AA762B1315FD86A6B8AF.address 50.7.74.172
+D1AFBF3117B308B6D1A7AA762B1315FD86A6B8AF.or_port 443
+D1AFBF3117B308B6D1A7AA762B1315FD86A6B8AF.dir_port 80
+D1AFBF3117B308B6D1A7AA762B1315FD86A6B8AF.nickname theia2
+D1AFBF3117B308B6D1A7AA762B1315FD86A6B8AF.has_extrainfo false
+D1AFBF3117B308B6D1A7AA762B1315FD86A6B8AF.orport6_address 2001:49f0:d002:2::52
+D1AFBF3117B308B6D1A7AA762B1315FD86A6B8AF.orport6_port 443
+D379A1CB8285748FFF64AE94296CA89878F25B22.address 62.141.38.69
+D379A1CB8285748FFF64AE94296CA89878F25B22.or_port 443
+D379A1CB8285748FFF64AE94296CA89878F25B22.dir_port 9030
+D379A1CB8285748FFF64AE94296CA89878F25B22.nickname angeltest3
+D379A1CB8285748FFF64AE94296CA89878F25B22.has_extrainfo false
+D379A1CB8285748FFF64AE94296CA89878F25B22.orport6_address 2001:4ba0:cafe:ac5::1
+D379A1CB8285748FFF64AE94296CA89878F25B22.orport6_port 443
D405FCCF06ADEDF898DF2F29C9348DCB623031BA.address 5.45.111.149
D405FCCF06ADEDF898DF2F29C9348DCB623031BA.or_port 443
D405FCCF06ADEDF898DF2F29C9348DCB623031BA.dir_port 80
@@ -784,21 +731,18 @@ D405FCCF06ADEDF898DF2F29C9348DCB623031BA.nickname gGDHjdcC6zAlM8k08lY
D405FCCF06ADEDF898DF2F29C9348DCB623031BA.has_extrainfo false
D405FCCF06ADEDF898DF2F29C9348DCB623031BA.orport6_address 2a03:4000:6:2388:df98:15f9:b34d:443
D405FCCF06ADEDF898DF2F29C9348DCB623031BA.orport6_port 443
+D50101A2ABD09DC245F7E96C0818D003CDD62351.address 50.7.74.174
+D50101A2ABD09DC245F7E96C0818D003CDD62351.or_port 443
+D50101A2ABD09DC245F7E96C0818D003CDD62351.dir_port 80
+D50101A2ABD09DC245F7E96C0818D003CDD62351.nickname theia6
+D50101A2ABD09DC245F7E96C0818D003CDD62351.has_extrainfo false
+D50101A2ABD09DC245F7E96C0818D003CDD62351.orport6_address 2001:49f0:d002:2::56
+D50101A2ABD09DC245F7E96C0818D003CDD62351.orport6_port 443
D5039E1EBFD96D9A3F9846BF99EC9F75EDDE902A.address 37.187.115.157
D5039E1EBFD96D9A3F9846BF99EC9F75EDDE902A.or_port 9001
D5039E1EBFD96D9A3F9846BF99EC9F75EDDE902A.dir_port 9030
D5039E1EBFD96D9A3F9846BF99EC9F75EDDE902A.nickname Janky328891
D5039E1EBFD96D9A3F9846BF99EC9F75EDDE902A.has_extrainfo false
-D6BA940D3255AB40DC5EE5B0B285FA143E1F9865.address 217.182.51.248
-D6BA940D3255AB40DC5EE5B0B285FA143E1F9865.or_port 443
-D6BA940D3255AB40DC5EE5B0B285FA143E1F9865.dir_port 80
-D6BA940D3255AB40DC5EE5B0B285FA143E1F9865.nickname Cosworth02
-D6BA940D3255AB40DC5EE5B0B285FA143E1F9865.has_extrainfo false
-D71B1CA1C9DC7E8CA64158E106AD770A21160FEE.address 185.34.33.2
-D71B1CA1C9DC7E8CA64158E106AD770A21160FEE.or_port 31415
-D71B1CA1C9DC7E8CA64158E106AD770A21160FEE.dir_port 9265
-D71B1CA1C9DC7E8CA64158E106AD770A21160FEE.nickname lqdn
-D71B1CA1C9DC7E8CA64158E106AD770A21160FEE.has_extrainfo false
D8B7A3A6542AA54D0946B9DC0257C53B6C376679.address 85.10.201.47
D8B7A3A6542AA54D0946B9DC0257C53B6C376679.or_port 9001
D8B7A3A6542AA54D0946B9DC0257C53B6C376679.dir_port 9030
@@ -816,6 +760,11 @@ DB2682153AC0CCAECD2BD1E9EBE99C6815807A1E.or_port 443
DB2682153AC0CCAECD2BD1E9EBE99C6815807A1E.dir_port 80
DB2682153AC0CCAECD2BD1E9EBE99C6815807A1E.nickname GermanCraft2
DB2682153AC0CCAECD2BD1E9EBE99C6815807A1E.has_extrainfo false
+DC163DDEF4B6F0C6BC226F9F6656A5A30C5C5686.address 176.158.236.102
+DC163DDEF4B6F0C6BC226F9F6656A5A30C5C5686.or_port 9001
+DC163DDEF4B6F0C6BC226F9F6656A5A30C5C5686.dir_port 9030
+DC163DDEF4B6F0C6BC226F9F6656A5A30C5C5686.nickname Underworld
+DC163DDEF4B6F0C6BC226F9F6656A5A30C5C5686.has_extrainfo false
DD823AFB415380A802DCAEB9461AE637604107FB.address 178.33.183.251
DD823AFB415380A802DCAEB9461AE637604107FB.or_port 443
DD823AFB415380A802DCAEB9461AE637604107FB.dir_port 80
@@ -830,13 +779,6 @@ DD8BD7307017407FCC36F8D04A688F74A0774C02.nickname DFRI0
DD8BD7307017407FCC36F8D04A688F74A0774C02.has_extrainfo false
DD8BD7307017407FCC36F8D04A688F74A0774C02.orport6_address 2001:67c:289c::20
DD8BD7307017407FCC36F8D04A688F74A0774C02.orport6_port 443
-DDBB2A38252ADDA53E4492DDF982CA6CC6E10EC0.address 83.212.99.68
-DDBB2A38252ADDA53E4492DDF982CA6CC6E10EC0.or_port 443
-DDBB2A38252ADDA53E4492DDF982CA6CC6E10EC0.dir_port 80
-DDBB2A38252ADDA53E4492DDF982CA6CC6E10EC0.nickname zouzounella
-DDBB2A38252ADDA53E4492DDF982CA6CC6E10EC0.has_extrainfo false
-DDBB2A38252ADDA53E4492DDF982CA6CC6E10EC0.orport6_address 2001:648:2ffc:1225:a800:bff:fe3d:67b5
-DDBB2A38252ADDA53E4492DDF982CA6CC6E10EC0.orport6_port 443
DED6892FF89DBD737BA689698A171B2392EB3E82.address 92.222.38.67
DED6892FF89DBD737BA689698A171B2392EB3E82.or_port 443
DED6892FF89DBD737BA689698A171B2392EB3E82.dir_port 80
@@ -844,6 +786,11 @@ DED6892FF89DBD737BA689698A171B2392EB3E82.nickname ThorExit
DED6892FF89DBD737BA689698A171B2392EB3E82.has_extrainfo false
DED6892FF89DBD737BA689698A171B2392EB3E82.orport6_address 2001:41d0:52:100::112a
DED6892FF89DBD737BA689698A171B2392EB3E82.orport6_port 443
+E41B16F7DDF52EBB1DB4268AB2FE340B37AD8904.address 166.70.207.2
+E41B16F7DDF52EBB1DB4268AB2FE340B37AD8904.or_port 9101
+E41B16F7DDF52EBB1DB4268AB2FE340B37AD8904.dir_port 9130
+E41B16F7DDF52EBB1DB4268AB2FE340B37AD8904.nickname xmission1
+E41B16F7DDF52EBB1DB4268AB2FE340B37AD8904.has_extrainfo false
E51620B90DCB310138ED89EDEDD0A5C361AAE24E.address 185.100.86.182
E51620B90DCB310138ED89EDEDD0A5C361AAE24E.or_port 8080
E51620B90DCB310138ED89EDEDD0A5C361AAE24E.dir_port 9030
@@ -854,11 +801,20 @@ E81EF60A73B3809F8964F73766B01BAA0A171E20.or_port 443
E81EF60A73B3809F8964F73766B01BAA0A171E20.dir_port 8080
E81EF60A73B3809F8964F73766B01BAA0A171E20.nickname Chimborazo
E81EF60A73B3809F8964F73766B01BAA0A171E20.has_extrainfo false
-EB80A8D52F07238B576C42CEAB98ADD084EE075E.address 51.254.147.57
-EB80A8D52F07238B576C42CEAB98ADD084EE075E.or_port 443
-EB80A8D52F07238B576C42CEAB98ADD084EE075E.dir_port 80
-EB80A8D52F07238B576C42CEAB98ADD084EE075E.nickname Cosworth01
-EB80A8D52F07238B576C42CEAB98ADD084EE075E.has_extrainfo false
+E8D114B3C78D8E6E7FEB1004650DD632C2143C9E.address 185.4.132.148
+E8D114B3C78D8E6E7FEB1004650DD632C2143C9E.or_port 443
+E8D114B3C78D8E6E7FEB1004650DD632C2143C9E.dir_port 80
+E8D114B3C78D8E6E7FEB1004650DD632C2143C9E.nickname libreonion1
+E8D114B3C78D8E6E7FEB1004650DD632C2143C9E.has_extrainfo false
+E8D114B3C78D8E6E7FEB1004650DD632C2143C9E.orport6_address 2a02:c500:2:f0::5492
+E8D114B3C78D8E6E7FEB1004650DD632C2143C9E.orport6_port 443
+EBE718E1A49EE229071702964F8DB1F318075FF8.address 131.188.40.188
+EBE718E1A49EE229071702964F8DB1F318075FF8.or_port 80
+EBE718E1A49EE229071702964F8DB1F318075FF8.dir_port 1443
+EBE718E1A49EE229071702964F8DB1F318075FF8.nickname fluxe4
+EBE718E1A49EE229071702964F8DB1F318075FF8.has_extrainfo true
+EBE718E1A49EE229071702964F8DB1F318075FF8.orport6_address 2001:638:a000:4140::ffff:188
+EBE718E1A49EE229071702964F8DB1F318075FF8.orport6_port 80
ED2338CAC2711B3E331392E1ED2831219B794024.address 192.87.28.28
ED2338CAC2711B3E331392E1ED2831219B794024.or_port 9001
ED2338CAC2711B3E331392E1ED2831219B794024.dir_port 9030
@@ -866,6 +822,13 @@ ED2338CAC2711B3E331392E1ED2831219B794024.nickname SEC6xFreeBSD64
ED2338CAC2711B3E331392E1ED2831219B794024.has_extrainfo false
ED2338CAC2711B3E331392E1ED2831219B794024.orport6_address 2001:678:230:3028:192:87:28:28
ED2338CAC2711B3E331392E1ED2831219B794024.orport6_port 9001
+EE4AF632058F0734C1426B1AD689F47445CA2056.address 37.252.187.111
+EE4AF632058F0734C1426B1AD689F47445CA2056.or_port 443
+EE4AF632058F0734C1426B1AD689F47445CA2056.dir_port 9030
+EE4AF632058F0734C1426B1AD689F47445CA2056.nickname angeltest7
+EE4AF632058F0734C1426B1AD689F47445CA2056.has_extrainfo false
+EE4AF632058F0734C1426B1AD689F47445CA2056.orport6_address 2a00:63c1:c:111::2
+EE4AF632058F0734C1426B1AD689F47445CA2056.orport6_port 443
EFEACD781604EB80FBC025EDEDEA2D523AEAAA2F.address 217.182.75.181
EFEACD781604EB80FBC025EDEDEA2D523AEAAA2F.or_port 9001
EFEACD781604EB80FBC025EDEDEA2D523AEAAA2F.dir_port 9030
@@ -876,13 +839,6 @@ F10BDE279AE71515DDCCCC61DC19AC8765F8A3CC.or_port 443
F10BDE279AE71515DDCCCC61DC19AC8765F8A3CC.dir_port 80
F10BDE279AE71515DDCCCC61DC19AC8765F8A3CC.nickname ParkBenchInd001
F10BDE279AE71515DDCCCC61DC19AC8765F8A3CC.has_extrainfo false
-F2DFE5FA1E4CF54F8E761A6D304B9B4EC69BDAE8.address 129.13.131.140
-F2DFE5FA1E4CF54F8E761A6D304B9B4EC69BDAE8.or_port 443
-F2DFE5FA1E4CF54F8E761A6D304B9B4EC69BDAE8.dir_port 80
-F2DFE5FA1E4CF54F8E761A6D304B9B4EC69BDAE8.nickname AlleKochenKaffee
-F2DFE5FA1E4CF54F8E761A6D304B9B4EC69BDAE8.has_extrainfo false
-F2DFE5FA1E4CF54F8E761A6D304B9B4EC69BDAE8.orport6_address 2a00:1398:5:f604:cafe:cafe:cafe:9001
-F2DFE5FA1E4CF54F8E761A6D304B9B4EC69BDAE8.orport6_port 443
F4263275CF54A6836EE7BD527B1328836A6F06E1.address 37.187.102.108
F4263275CF54A6836EE7BD527B1328836A6F06E1.or_port 443
F4263275CF54A6836EE7BD527B1328836A6F06E1.dir_port 80
@@ -890,6 +846,11 @@ F4263275CF54A6836EE7BD527B1328836A6F06E1.nickname EvilMoe
F4263275CF54A6836EE7BD527B1328836A6F06E1.has_extrainfo false
F4263275CF54A6836EE7BD527B1328836A6F06E1.orport6_address 2001:41d0:a:266c::1
F4263275CF54A6836EE7BD527B1328836A6F06E1.orport6_port 443
+F4C0EDAA0BF0F7EC138746F8FEF1CE26C7860265.address 5.199.142.236
+F4C0EDAA0BF0F7EC138746F8FEF1CE26C7860265.or_port 9001
+F4C0EDAA0BF0F7EC138746F8FEF1CE26C7860265.dir_port 9030
+F4C0EDAA0BF0F7EC138746F8FEF1CE26C7860265.nickname tornodenumber9004
+F4C0EDAA0BF0F7EC138746F8FEF1CE26C7860265.has_extrainfo false
F6A358DD367B3282D6EF5824C9D45E1A19C7E815.address 192.160.102.168
F6A358DD367B3282D6EF5824C9D45E1A19C7E815.or_port 9001
F6A358DD367B3282D6EF5824C9D45E1A19C7E815.dir_port 80
@@ -897,13 +858,6 @@ F6A358DD367B3282D6EF5824C9D45E1A19C7E815.nickname prawksi
F6A358DD367B3282D6EF5824C9D45E1A19C7E815.has_extrainfo false
F6A358DD367B3282D6EF5824C9D45E1A19C7E815.orport6_address 2620:132:300c:c01d::8
F6A358DD367B3282D6EF5824C9D45E1A19C7E815.orport6_port 9002
-F741E5124CB12700DA946B78C9B2DD175D6CD2A1.address 163.172.154.162
-F741E5124CB12700DA946B78C9B2DD175D6CD2A1.or_port 9001
-F741E5124CB12700DA946B78C9B2DD175D6CD2A1.dir_port 9030
-F741E5124CB12700DA946B78C9B2DD175D6CD2A1.nickname rofltor06
-F741E5124CB12700DA946B78C9B2DD175D6CD2A1.has_extrainfo false
-F741E5124CB12700DA946B78C9B2DD175D6CD2A1.orport6_address 2001:bc8:4400:2100::17:419
-F741E5124CB12700DA946B78C9B2DD175D6CD2A1.orport6_port 9001
F8D27B163B9247B232A2EEE68DD8B698695C28DE.address 78.47.18.110
F8D27B163B9247B232A2EEE68DD8B698695C28DE.or_port 80
F8D27B163B9247B232A2EEE68DD8B698695C28DE.dir_port 443
@@ -911,23 +865,13 @@ F8D27B163B9247B232A2EEE68DD8B698695C28DE.nickname fluxe3
F8D27B163B9247B232A2EEE68DD8B698695C28DE.has_extrainfo true
F8D27B163B9247B232A2EEE68DD8B698695C28DE.orport6_address 2a01:4f8:120:4023::110
F8D27B163B9247B232A2EEE68DD8B698695C28DE.orport6_port 80
-F9246DEF2B653807236DA134F2AEAB103D58ABFE.address 178.254.19.101
-F9246DEF2B653807236DA134F2AEAB103D58ABFE.or_port 443
-F9246DEF2B653807236DA134F2AEAB103D58ABFE.dir_port 80
-F9246DEF2B653807236DA134F2AEAB103D58ABFE.nickname Freebird31
-F9246DEF2B653807236DA134F2AEAB103D58ABFE.has_extrainfo true
F93D8F37E35C390BCAD9F9069E13085B745EC216.address 185.96.180.29
F93D8F37E35C390BCAD9F9069E13085B745EC216.or_port 443
F93D8F37E35C390BCAD9F9069E13085B745EC216.dir_port 80
F93D8F37E35C390BCAD9F9069E13085B745EC216.nickname TykRelay06
F93D8F37E35C390BCAD9F9069E13085B745EC216.has_extrainfo false
-FC9AC8EA0160D88BCCFDE066940D7DD9FA45495B.address 86.59.119.83
-FC9AC8EA0160D88BCCFDE066940D7DD9FA45495B.or_port 443
-FC9AC8EA0160D88BCCFDE066940D7DD9FA45495B.dir_port 80
-FC9AC8EA0160D88BCCFDE066940D7DD9FA45495B.nickname ph3x
-FC9AC8EA0160D88BCCFDE066940D7DD9FA45495B.has_extrainfo false
-FC9AC8EA0160D88BCCFDE066940D7DD9FA45495B.orport6_address 2001:858:2:30:86:59:119:83
-FC9AC8EA0160D88BCCFDE066940D7DD9FA45495B.orport6_port 443
+F93D8F37E35C390BCAD9F9069E13085B745EC216.orport6_address 2a00:4820::185:96:180:29
+F93D8F37E35C390BCAD9F9069E13085B745EC216.orport6_port 443
FE296180018833AF03A8EACD5894A614623D3F76.address 149.56.45.200
FE296180018833AF03A8EACD5894A614623D3F76.or_port 9001
FE296180018833AF03A8EACD5894A614623D3F76.dir_port 9030
@@ -935,3 +879,10 @@ FE296180018833AF03A8EACD5894A614623D3F76.nickname PyotrTorpotkinOne
FE296180018833AF03A8EACD5894A614623D3F76.has_extrainfo false
FE296180018833AF03A8EACD5894A614623D3F76.orport6_address 2607:5300:201:3000::17d3
FE296180018833AF03A8EACD5894A614623D3F76.orport6_port 9002
+FFA72BD683BC2FCF988356E6BEC1E490F313FB07.address 193.11.164.243
+FFA72BD683BC2FCF988356E6BEC1E490F313FB07.or_port 9001
+FFA72BD683BC2FCF988356E6BEC1E490F313FB07.dir_port 9030
+FFA72BD683BC2FCF988356E6BEC1E490F313FB07.nickname Lule
+FFA72BD683BC2FCF988356E6BEC1E490F313FB07.has_extrainfo false
+FFA72BD683BC2FCF988356E6BEC1E490F313FB07.orport6_address 2001:6b0:7:125::243
+FFA72BD683BC2FCF988356E6BEC1E490F313FB07.orport6_port 9001
diff --git a/stem/cached_manual.sqlite b/stem/cached_manual.sqlite
index 5069976c..515e894b 100644
Binary files a/stem/cached_manual.sqlite and b/stem/cached_manual.sqlite differ
diff --git a/stem/settings.cfg b/stem/settings.cfg
index a2fa2820..b7be1ee1 100644
--- a/stem/settings.cfg
+++ b/stem/settings.cfg
@@ -287,7 +287,6 @@ manual.summary.AuthoritativeDirectory Act as a directory authority
manual.summary.V3AuthoritativeDirectory Generates a version 3 consensus
manual.summary.VersioningAuthoritativeDirectory Provides opinions on recommended versions of tor
manual.summary.RecommendedVersions Suggested versions of tor
-manual.summary.RecommendedPackages Suggested versions of applications other than tor
manual.summary.RecommendedClientVersions Tor versions believed to be safe for clients
manual.summary.BridgeAuthoritativeDir Acts as a bridge authority
manual.summary.MinUptimeHidServDirectoryV2 Required uptime before accepting hidden service directory
diff --git a/test/integ/manual.py b/test/integ/manual.py
index a5cc1be5..de86f695 100644
--- a/test/integ/manual.py
+++ b/test/integ/manual.py
@@ -38,7 +38,7 @@ EXPECTED_CATEGORIES = set([
'AUTHORS',
])
-EXPECTED_CLI_OPTIONS = set(['-f FILE', '--hash-password PASSWORD', '--ignore-missing-torrc', '--defaults-torrc FILE', '--key-expiration [purpose]', '--list-fingerprint', '--list-deprecated-options', '--allow-missing-torrc', '--nt-service', '--verify-config', '--service remove|start|stop', '--passphrase-fd FILEDES', '--keygen [--newpass]', '--list-torrc-options', '--service install [--options command-line options]', '--list-modules', '--quiet|--hush', '--version', '-h, -help'])
+EXPECTED_CLI_OPTIONS = set(['-f FILE', '--hash-password PASSWORD', '--ignore-missing-torrc', '--defaults-torrc FILE', '--key-expiration [purpose]', '--list-fingerprint', '--list-deprecated-options', '--allow-missing-torrc', '--nt-service', '--verify-config', '--service remove|start|stop', '--passphrase-fd FILEDES', '--keygen [--newpass]', '--list-torrc-options', '--service install [--options command-line options]', '--list-modules', '--quiet|--hush', '--version', '-h, --help'])
EXPECTED_SIGNALS = set(['SIGTERM', 'SIGINT', 'SIGHUP', 'SIGUSR1', 'SIGUSR2', 'SIGCHLD', 'SIGPIPE', 'SIGXFSZ'])
EXPECTED_DESCRIPTION = """
@@ -162,7 +162,7 @@ class TestManual(unittest.TestCase):
def assert_equal(category, expected, actual):
if expected != actual:
- self.fail("Changed tor's man page? The %s changed as follows...\n\nexpected: %s\n\nactual: %s" % (category, expected, actual))
+ self.fail("Changed tor's man page? The %s changed as follows...\n\nexpected: %s\n\nactual: %s" % (category, sorted(expected), sorted(actual)))
manual = stem.manual.Manual.from_man(self.man_path)
@@ -171,7 +171,7 @@ class TestManual(unittest.TestCase):
assert_equal('description', EXPECTED_DESCRIPTION, manual.description)
assert_equal('commandline options', EXPECTED_CLI_OPTIONS, set(manual.commandline_options.keys()))
- assert_equal('help option', 'Display a short help message and exit.', manual.commandline_options['-h, -help'])
+ assert_equal('help option', 'Display a short help message and exit.', manual.commandline_options['-h, --help'])
assert_equal('file option', EXPECTED_FILE_DESCRIPTION, manual.commandline_options['-f FILE'])
assert_equal('signals', EXPECTED_SIGNALS, set(manual.signals.keys()))
diff --git a/test/unit/directory/fallback.py b/test/unit/directory/fallback.py
index 3f5ceca3..2423932f 100644
--- a/test/unit/directory/fallback.py
+++ b/test/unit/directory/fallback.py
@@ -92,7 +92,7 @@ class TestFallback(unittest.TestCase):
def test_from_cache(self):
fallbacks = stem.directory.Fallback.from_cache()
self.assertTrue(len(fallbacks) > 10)
- self.assertEqual('193.171.202.146', fallbacks['01A9258A46E97FF8B2CAC7910577862C14F2C524'].address)
+ self.assertEqual('185.13.39.197', fallbacks['001524DD403D729F08F7E5D77813EF12756CFA8D'].address)
@patch(URL_OPEN, Mock(return_value = io.BytesIO(FALLBACK_GITWEB_CONTENT)))
def test_from_remote(self):
1
0

17 Aug '19
commit 6a44d211342a727b71824825262123aeaf300c99
Author: Damian Johnson <atagar(a)torproject.org>
Date: Sat Aug 17 13:22:53 2019 -0700
Add CollecTor to our descriptor tutorial
Replacing our deprecated stem.descriptor.reader example with usage of our new
collector module.
---
docs/_static/example/collector_caching.py | 18 ++++++++++
docs/_static/example/collector_reading.py | 10 ++++++
docs/_static/example/past_descriptors.py | 5 ---
docs/api.rst | 1 +
docs/api/descriptor/collector.rst | 5 +++
docs/change_log.rst | 3 +-
docs/contents.rst | 1 +
docs/tutorials/mirror_mirror_on_the_wall.rst | 13 +++++--
stem/descriptor/collector.py | 51 ++++++----------------------
stem/descriptor/server_descriptor.py | 17 ++++++----
test/unit/tutorial.py | 18 +++++-----
11 files changed, 78 insertions(+), 64 deletions(-)
diff --git a/docs/_static/example/collector_caching.py b/docs/_static/example/collector_caching.py
new file mode 100644
index 00000000..bff63c47
--- /dev/null
+++ b/docs/_static/example/collector_caching.py
@@ -0,0 +1,18 @@
+import datetime
+import stem.descriptor
+import stem.descriptor.collector
+
+yesterday = datetime.datetime.utcnow() - datetime.timedelta(days = 1)
+cache_dir = '~/descriptor_cache/server_desc_today'
+
+collector = stem.descriptor.collector.CollecTor()
+
+for f in collector.files('server-descriptor', start = yesterday):
+ f.download(cache_dir)
+
+# then later...
+
+for f in collector.files('server-descriptor', start = yesterday):
+ for desc in f.read(cache_dir):
+ if desc.exit_policy.is_exiting_allowed():
+ print(' %s (%s)' % (desc.nickname, desc.fingerprint))
diff --git a/docs/_static/example/collector_reading.py b/docs/_static/example/collector_reading.py
new file mode 100644
index 00000000..06cc913a
--- /dev/null
+++ b/docs/_static/example/collector_reading.py
@@ -0,0 +1,10 @@
+import datetime
+import stem.descriptor.collector
+
+yesterday = datetime.datetime.utcnow() - datetime.timedelta(days = 1)
+
+# provide yesterday's exits
+
+for desc in stem.descriptor.collector.get_server_descriptors(start = yesterday):
+ if desc.exit_policy.is_exiting_allowed():
+ print(' %s (%s)' % (desc.nickname, desc.fingerprint))
diff --git a/docs/_static/example/past_descriptors.py b/docs/_static/example/past_descriptors.py
deleted file mode 100644
index 41004845..00000000
--- a/docs/_static/example/past_descriptors.py
+++ /dev/null
@@ -1,5 +0,0 @@
-from stem.descriptor.reader import DescriptorReader
-
-with DescriptorReader(["/home/atagar/server-descriptors-2013-03.tar"]) as reader:
- for desc in reader:
- print("found relay %s (%s)" % (desc.nickname, desc.fingerprint))
diff --git a/docs/api.rst b/docs/api.rst
index 2e2f9fae..a8ba7e24 100644
--- a/docs/api.rst
+++ b/docs/api.rst
@@ -43,6 +43,7 @@ remotely like Tor does.
* `stem.directory <api/directory.html>`_ - Directory authority and fallback directory information.
* `stem.descriptor.reader <api/descriptor/reader.html>`_ - Reads and parses descriptor files from disk.
* `stem.descriptor.remote <api/descriptor/remote.html>`_ - Downloads descriptors from directory mirrors and authorities.
+* `stem.descriptor.collector <api/descriptor/collector.html>`_ - Downloads past descriptors from `CollecTor <https://metrics.torproject.org/collector.html>`_.
* `stem.descriptor.export <api/descriptor/export.html>`_ - Exports descriptors to other formats.
Utilities
diff --git a/docs/api/descriptor/collector.rst b/docs/api/descriptor/collector.rst
new file mode 100644
index 00000000..e699d0e7
--- /dev/null
+++ b/docs/api/descriptor/collector.rst
@@ -0,0 +1,5 @@
+CollecTor
+=========
+
+.. automodule:: stem.descriptor.collector
+
diff --git a/docs/change_log.rst b/docs/change_log.rst
index fec98f5b..a2337e60 100644
--- a/docs/change_log.rst
+++ b/docs/change_log.rst
@@ -56,6 +56,7 @@ The following are only available within Stem's `git repository
* **Descriptors**
+ * Added the `stem.descriptor.collector <api/descriptor/collector.html>`_ module.
* `Bandwidth file support <api/descriptor/bandwidth_file.html>`_ (:trac:`29056`)
* Ed25519 validity checks are now done though the cryptography module rather than PyNaCl (:trac:`22022`)
* Download compressed descriptors by default (:trac:`29186`)
@@ -134,7 +135,7 @@ and the `stem.directory module <api/directory.html>`_.
* Added the *orport_v6* attribute to the :class:`~stem.directory.Authority` class
* Added server descriptor's new is_hidden_service_dir attribute
* Added the network status vote's new bandwidth_file_headers attribute (:spec:`84591df`)
- * Added the microdescriptor router status entry's new or_addresses attribute (:trac:`26405`, :spec:`fdc8f3e8`)
+ * Added the microdescriptor router status entry's new or_addresses attribute (:trac:`26405`, :spec:`fdc8f3e`)
* Don't retry downloading descriptors when we've timed out
* Don't download from tor26, an authority that frequently timeout
* Replaced Bifroest bridge authority with Serge (:trac:`26771`)
diff --git a/docs/contents.rst b/docs/contents.rst
index fb4d6b24..267979e0 100644
--- a/docs/contents.rst
+++ b/docs/contents.rst
@@ -43,6 +43,7 @@ Contents
api/descriptor/bandwidth_file
api/descriptor/certificate
+ api/descriptor/collector
api/descriptor/descriptor
api/descriptor/server_descriptor
api/descriptor/extrainfo_descriptor
diff --git a/docs/tutorials/mirror_mirror_on_the_wall.rst b/docs/tutorials/mirror_mirror_on_the_wall.rst
index eed4c65c..04cc86de 100644
--- a/docs/tutorials/mirror_mirror_on_the_wall.rst
+++ b/docs/tutorials/mirror_mirror_on_the_wall.rst
@@ -117,10 +117,17 @@ Where can I get past descriptors?
---------------------------------
Descriptor archives are available from `CollecTor
-<https://collector.torproject.org/>`_. These archives can be read with
-the `DescriptorReader <../api/descriptor/reader.html>`_...
+<https://metrics.torproject.org/collector.html>`_. If you need Tor's topology
+at a prior point in time this is the place to go!
-.. literalinclude:: /_static/example/past_descriptors.py
+With CollecTor you can either read descriptors directly...
+
+.. literalinclude:: /_static/example/collector_reading.py
+ :language: python
+
+... or download the descriptors to disk and read them later.
+
+.. literalinclude:: /_static/example/collector_caching.py
:language: python
.. _can-i-get-descriptors-from-the-tor-process:
diff --git a/stem/descriptor/collector.py b/stem/descriptor/collector.py
index 20eb6872..28fcbd49 100644
--- a/stem/descriptor/collector.py
+++ b/stem/descriptor/collector.py
@@ -2,50 +2,19 @@
# See LICENSE for licensing information
"""
-Module for downloading from Tor's descriptor archive, CollecTor...
+Descriptor archives are available from `CollecTor
+<https://metrics.torproject.org/collector.html>`_. If you need Tor's topology
+at a prior point in time this is the place to go!
- https://collector.torproject.org/
+With CollecTor you can either read descriptors directly...
-This stores descriptors going back in time. If you need to know what the
-network topology looked like at a past point in time, this is the place to go.
-
-With this you can either download and read directly from CollecTor...
-
-::
-
- import datetime
- import stem.descriptor.collector
-
- yesterday = datetime.datetime.utcnow() - datetime.timedelta(days = 1)
-
- # provide yesterday's exits
-
- for desc in stem.descriptor.collector.get_server_descriptors(start = yesterday):
- if desc.exit_policy.is_exiting_allowed():
- print(' %s (%s)' % (desc.nickname, desc.fingerprint))
+.. literalinclude:: /_static/example/collector_reading.py
+ :language: python
... or download the descriptors to disk and read them later.
-::
-
- import datetime
- import stem.descriptor
- import stem.descriptor.collector
-
- yesterday = datetime.datetime.utcnow() - datetime.timedelta(days = 1)
- cache_dir = '~/descriptor_cache/server_desc_today'
-
- collector = stem.descriptor.collector.CollecTor()
-
- for f in collector.files('server-descriptor', start = yesterday):
- f.download(cache_dir)
-
- # then later...
-
- for f in collector.files('server-descriptor', start = yesterday):
- for desc in f.read(cache_dir):
- if desc.exit_policy.is_exiting_allowed():
- print(' %s (%s)' % (desc.nickname, desc.fingerprint))
+.. literalinclude:: /_static/example/collector_caching.py
+ :language: python
::
@@ -282,7 +251,7 @@ class File(object):
:param str descriptor_type: `descriptor type
<https://metrics.torproject.org/collector.html#data-formats>`_, this is
guessed if not provided
- :var stem.descriptor.__init__.DocumentHandler document_handler: method in
+ :param stem.descriptor.__init__.DocumentHandler document_handler: method in
which to parse a :class:`~stem.descriptor.networkstatus.NetworkStatusDocument`
:param int timeout: timeout when connection becomes idle, no timeout
applied if **None**
@@ -553,7 +522,7 @@ class CollecTor(object):
:param datetime.datetime end: time range to end with
:param str cache_to: directory to cache archives into, if an archive is
available here it is not downloaded
- :var stem.descriptor.__init__.DocumentHandler document_handler: method in
+ :param stem.descriptor.__init__.DocumentHandler document_handler: method in
which to parse a :class:`~stem.descriptor.networkstatus.NetworkStatusDocument`
:param int version: consensus variant to retrieve (versions 2 or 3)
:param bool microdescriptor: provides the microdescriptor consensus if
diff --git a/stem/descriptor/server_descriptor.py b/stem/descriptor/server_descriptor.py
index 2d9133f5..85e35f57 100644
--- a/stem/descriptor/server_descriptor.py
+++ b/stem/descriptor/server_descriptor.py
@@ -869,21 +869,26 @@ class RelayDescriptor(ServerDescriptor):
self.certificate.validate(self)
@classmethod
- def content(cls, attr = None, exclude = (), sign = False, signing_key = None):
+ def content(cls, attr = None, exclude = (), sign = False, signing_key = None, exit_policy = None):
if signing_key:
sign = True
if attr is None:
attr = {}
- base_header = (
+ if exit_policy is None:
+ exit_policy = REJECT_ALL_POLICY
+
+ base_header = [
('router', '%s %s 9001 0 0' % (_random_nickname(), _random_ipv4_address())),
('published', _random_date()),
('bandwidth', '153600 256000 104590'),
- ('reject', '*:*'),
+ ] + [
+ tuple(line.split(' ', 1)) for line in str(exit_policy).splitlines()
+ ] + [
('onion-key', _random_crypto_blob('RSA PUBLIC KEY')),
('signing-key', _random_crypto_blob('RSA PUBLIC KEY')),
- )
+ ]
if sign:
if attr and 'signing-key' in attr:
@@ -909,8 +914,8 @@ class RelayDescriptor(ServerDescriptor):
))
@classmethod
- def create(cls, attr = None, exclude = (), validate = True, sign = False, signing_key = None):
- return cls(cls.content(attr, exclude, sign, signing_key), validate = validate, skip_crypto_validation = not sign)
+ def create(cls, attr = None, exclude = (), validate = True, sign = False, signing_key = None, exit_policy = None):
+ return cls(cls.content(attr, exclude, sign, signing_key, exit_policy), validate = validate, skip_crypto_validation = not sign)
@lru_cache()
def digest(self, hash_type = DigestHash.SHA1, encoding = DigestEncoding.HEX):
diff --git a/test/unit/tutorial.py b/test/unit/tutorial.py
index c74b1912..9d70a5cf 100644
--- a/test/unit/tutorial.py
+++ b/test/unit/tutorial.py
@@ -8,10 +8,10 @@ import unittest
import stem.descriptor.remote
from stem.control import Controller
-from stem.descriptor.reader import DescriptorReader
from stem.descriptor.router_status_entry import RouterStatusEntryV2, RouterStatusEntryV3
from stem.descriptor.networkstatus import NetworkStatusDocumentV3
from stem.descriptor.server_descriptor import RelayDescriptor
+from stem.exit_policy import ExitPolicy
from test.unit import exec_documentation_example
try:
@@ -165,13 +165,15 @@ class TestTutorial(unittest.TestCase):
self.assertEqual('found relay caerSidi (A7569A83B5706AB1B1A9CB52EFF7D2D32E4553EB)\n', stdout_mock.getvalue())
@patch('sys.stdout', new_callable = StringIO)
- @patch('stem.descriptor.reader.DescriptorReader', spec = DescriptorReader)
- def test_mirror_mirror_on_the_wall_4(self, reader_mock, stdout_mock):
- reader = reader_mock().__enter__()
- reader.__iter__.return_value = iter([RelayDescriptor.create({'router': 'caerSidi 71.35.133.197 9001 0 0'})])
-
- exec_documentation_example('past_descriptors.py')
- self.assertEqual('found relay caerSidi (None)\n', stdout_mock.getvalue())
+ @patch('stem.descriptor.collector.get_server_descriptors')
+ def test_mirror_mirror_on_the_wall_4(self, get_desc_mock, stdout_mock):
+ get_desc_mock.return_value = iter([RelayDescriptor.create({
+ 'router': 'caerSidi 71.35.133.197 9001 0 0',
+ 'fingerprint': '2C3C 4662 5698 B6D6 7DF3 2BC1 918A D3EE 1F99 06B1',
+ }, exit_policy = ExitPolicy('accept *:*'), validate = False)])
+
+ exec_documentation_example('collector_reading.py')
+ self.assertEqual(' caerSidi (2C3C46625698B6D67DF32BC1918AD3EE1F9906B1)\n', stdout_mock.getvalue())
@patch('sys.stdout', new_callable = StringIO)
@patch('stem.descriptor.remote.DescriptorDownloader')
1
0
commit 97c9a58eab40ce32256afbb02a4f8c6c84045bb1
Merge: 4357e548 6a44d211
Author: Damian Johnson <atagar(a)torproject.org>
Date: Sat Aug 17 13:42:52 2019 -0700
CollecTor module
Brand new module that makes it simple to browse tor's network topology at prior
points in time.
https://trac.torproject.org/projects/tor/ticket/17979
docs/_static/example/collector_caching.py | 18 +
docs/_static/example/collector_reading.py | 10 +
docs/_static/example/past_descriptors.py | 5 -
docs/api.rst | 1 +
docs/api/descriptor/collector.rst | 5 +
docs/change_log.rst | 3 +-
docs/contents.rst | 1 +
docs/tutorials/mirror_mirror_on_the_wall.rst | 13 +-
run_tests.py | 15 +-
stem/__init__.py | 67 ++
stem/cached_fallbacks.cfg | 775 ++++++++++-----------
stem/cached_manual.sqlite | Bin 248832 -> 249856 bytes
stem/descriptor/__init__.py | 90 +++
stem/descriptor/collector.py | 727 +++++++++++++++++++
stem/descriptor/hidden_service_descriptor.py | 3 +
stem/descriptor/networkstatus.py | 7 +-
stem/descriptor/remote.py | 125 ++--
stem/descriptor/router_status_entry.py | 19 +
stem/descriptor/server_descriptor.py | 17 +-
stem/directory.py | 27 +-
stem/manual.py | 6 +-
stem/settings.cfg | 1 -
stem/util/connection.py | 52 ++
test/arguments.py | 21 +-
test/integ/descriptor/__init__.py | 1 +
test/integ/descriptor/collector.py | 98 +++
test/integ/manual.py | 6 +-
test/integ/util/connection.py | 34 +-
test/settings.cfg | 3 +
test/unit/descriptor/__init__.py | 2 +
test/unit/descriptor/collector.py | 373 ++++++++++
test/unit/descriptor/compression.py | 39 ++
test/unit/descriptor/data/__init__.py | 7 +
test/unit/descriptor/data/collector/__init__.py | 7 +
.../data/collector/bandwidths-2019-05-cropped.tar | Bin 0 -> 32768 bytes
.../bridge-extra-infos-2019-03-cropped.tar | Bin 0 -> 15872 bytes
.../bridge-server-descriptors-2019-02-cropped.tar | Bin 0 -> 9216 bytes
.../collector/bridge-statuses-2019-05-cropped.tar | Bin 0 -> 467456 bytes
.../descriptor/data/collector/certs-cropped.tar | Bin 0 -> 14336 bytes
.../data/collector/consensuses-2018-06-cropped.tar | Bin 0 -> 100864 bytes
.../data/collector/exit-list-2018-11-cropped.tar | Bin 0 -> 590336 bytes
.../data/collector/extra-infos-2019-04-cropped.tar | Bin 0 -> 22528 bytes
test/unit/descriptor/data/collector/index.json | 1 +
test/unit/descriptor/data/collector/index.py | 530 ++++++++++++++
.../data/collector/microdescs-2019-05-cropped.tar | Bin 0 -> 193024 bytes
.../server-descriptors-2005-12-cropped.tar | Bin 0 -> 22528 bytes
test/unit/descriptor/data/compressed_bz2 | Bin 0 -> 1691 bytes
test/unit/descriptor/remote.py | 13 +-
test/unit/directory/authority.py | 3 +-
test/unit/directory/fallback.py | 5 +-
test/unit/tutorial.py | 18 +-
test/unit/util/connection.py | 44 ++
52 files changed, 2656 insertions(+), 536 deletions(-)
1
0
commit ce8474dcf61cdb3800108e3820dadcef545220ee
Author: Damian Johnson <atagar(a)torproject.org>
Date: Mon Dec 25 13:10:14 2017 -0800
Stub initial CollecTor module
Presently doesn't do much. Just starting with url resolution and fetching the
index.
---
stem/descriptor/__init__.py | 1 +
stem/descriptor/collector.py | 145 +++++++++++++++++++++++++++++++++++++
test/integ/descriptor/__init__.py | 1 +
test/integ/descriptor/collector.py | 20 +++++
test/settings.cfg | 2 +
test/unit/descriptor/__init__.py | 1 +
test/unit/descriptor/collector.py | 16 ++++
7 files changed, 186 insertions(+)
diff --git a/stem/descriptor/__init__.py b/stem/descriptor/__init__.py
index ef6530ed..4d13ec60 100644
--- a/stem/descriptor/__init__.py
+++ b/stem/descriptor/__init__.py
@@ -113,6 +113,7 @@ except ImportError:
__all__ = [
'bandwidth_file',
'certificate',
+ 'collector',
'export',
'extrainfo_descriptor',
'hidden_service_descriptor',
diff --git a/stem/descriptor/collector.py b/stem/descriptor/collector.py
new file mode 100644
index 00000000..ca0e6921
--- /dev/null
+++ b/stem/descriptor/collector.py
@@ -0,0 +1,145 @@
+# Copyright 2017, Damian Johnson and The Tor Project
+# See LICENSE for licensing information
+
+"""
+Module for downloading from Tor's descriptor archive, CollecTor...
+
+ https://collector.torproject.org/
+
+This stores descriptors going back in time. If you need to know what the
+network topology looked like at a past point in time, this is the place to go.
+
+With this you can either download and read directly from CollecTor...
+
+::
+
+ import datetime
+ import stem.descriptor.collector
+
+ collector = stem.descriptor.collector.CollecTor()
+ yesterday = datetime.date.today() - datetime.timedelta(1)
+
+ # provide yesterday's exits
+
+ for desc in collector.get_server_descriptors(start = yesterday):
+ if desc.exit_policy.is_exiting_allowed():
+ print ' %s (%s)' % (desc.nickname, desc.fingerprint)
+
+... or download the descriptors to disk and read them later.
+
+::
+
+ import datetime
+ import stem.descriptor.collector
+ import stem.descriptor.reader
+
+ collector = stem.descriptor.collector.CollecTor()
+ yesterday = datetime.date.today() - datetime.timedelta(1)
+
+ collector.download_server_descriptors(
+ destination = '~/descriptor_cache',
+ start = yesterday,
+ ).join()
+
+ reader = stem.descriptor.reader.DescriptorReader('~/descriptor_cache')
+
+ for desc in reader:
+ if desc.exit_policy.is_exiting_allowed():
+ print ' %s (%s)' % (desc.nickname, desc.fingerprint)
+
+.. versionadded:: 1.7.0
+"""
+
+import json
+import time
+
+try:
+ # account for urllib's change between python 2.x and 3.x
+ import urllib.request as urllib
+except ImportError:
+ import urllib2 as urllib
+
+import stem.util.enum
+
+Compression = stem.util.enum.Enum('NONE', 'BZ2', 'GZ', 'XZ')
+
+COLLECTOR_URL = 'https://collector.torproject.org/'
+REFRESH_INDEX_RATE = 3600 # get new index if cached copy is an hour old
+
+COMPRESSION_SUFFIX = {
+ Compression.NONE: '',
+ Compression.BZ2: '.bz2',
+ Compression.GZ: '.gz',
+ Compression.XZ: '.xz',
+}
+
+
+def url(resource, compression = Compression.NONE):
+ """
+ Provides CollecTor url for the given resource.
+
+ :param str resource: resource type of the url
+ :param descriptor.collector.Compression compression: compression type to
+ download from
+
+ :returns: **str** with the CollecTor url
+ """
+
+ if compression not in COMPRESSION_SUFFIX:
+ raise ValueError("'%s' isn't a compression enumeration" % compression)
+
+ # TODO: Not yet sure how to most elegantly map resources to urls. No doubt
+ # this'll change as we add more types.
+
+ if resource == 'index':
+ path = ('index', 'index.json')
+ else:
+ raise ValueError("'%s' isn't a recognized resource type" % resource)
+
+ return ''.join((COLLECTOR_URL, '/'.join(path), COMPRESSION_SUFFIX[compression]))
+
+
+class CollecTor(object):
+ """
+ Downloader for descriptors from CollecTor. The contents of CollecTor are
+ provided in `an index <https://collector.torproject.org/index/index.json>`_
+ that's fetched as required.
+
+ :var descriptor.collector.Compression compression: compression type to
+ download from
+ :var int retries: number of times to attempt the request if downloading it
+ fails
+ :var float timeout: duration before we'll time out our request
+ """
+
+ def __init__(self, compression = Compression.XZ, retries = 2, timeout = None):
+ self.compression = compression
+ self.retries = retries
+ self.timeout = timeout
+
+ self._cached_index = None
+ self._cached_index_at = 0
+
+ def index(self):
+ """
+ Provides the archives available in CollecTor.
+
+ :returns: **dict** with the archive contents
+
+ :raises:
+ If unable to retrieve the index this provide...
+
+ * **ValueError** if the index is malformed
+ * **socket.timeout** if our request timed out
+ * **urllib2.URLError** for most request failures
+ """
+
+ if not self._cached_index or time.time() - self._cached_index_at >= REFRESH_INDEX_RATE:
+ response = urllib.urlopen(url('index', self.compression), timeout = self.timeout).read()
+
+ # TODO: add compression and retry support
+
+ self._cached_index = json.loads(response)
+ self._cached_index_at = time.time()
+
+ return self._cached_index
diff --git a/test/integ/descriptor/__init__.py b/test/integ/descriptor/__init__.py
index 331316a2..2ed1feef 100644
--- a/test/integ/descriptor/__init__.py
+++ b/test/integ/descriptor/__init__.py
@@ -3,6 +3,7 @@ Integration tests for stem.descriptor.* contents.
"""
__all__ = [
+ 'collector',
'extrainfo_descriptor',
'microdescriptor',
'networkstatus',
diff --git a/test/integ/descriptor/collector.py b/test/integ/descriptor/collector.py
new file mode 100644
index 00000000..25f5d503
--- /dev/null
+++ b/test/integ/descriptor/collector.py
@@ -0,0 +1,20 @@
+"""
+Integration tests for stem.descriptor.collector.
+"""
+
+import unittest
+
+import test.require
+
+from stem.descriptor.collector import CollecTor, Compression
+
+
+class TestCollector(unittest.TestCase):
+ @test.require.only_run_once
+ @test.require.online
+ def test_index(self):
+ collector = CollecTor(compression = Compression.NONE)
+ index = collector.index()
+
+ self.assertEqual('https://collector.torproject.org', index['path'])
+ self.assertEqual(['archive', 'recent'], [entry['path'] for entry in index['directories']])
diff --git a/test/settings.cfg b/test/settings.cfg
index d422ffa8..6f71a329 100644
--- a/test/settings.cfg
+++ b/test/settings.cfg
@@ -239,6 +239,7 @@ test.unit_tests
|test.unit.util.tor_tools.TestTorTools
|test.unit.util.__init__.TestBaseUtil
|test.unit.installation.TestInstallation
+|test.unit.descriptor.collector.TestCollector
|test.unit.descriptor.descriptor.TestDescriptor
|test.unit.descriptor.export.TestExport
|test.unit.descriptor.reader.TestDescriptorReader
@@ -309,6 +310,7 @@ test.integ_tests
|test.integ.connection.connect.TestConnect
|test.integ.control.base_controller.TestBaseController
|test.integ.control.controller.TestController
+|test.integ.descriptor.collector.TestCollector
|test.integ.descriptor.remote.TestDescriptorDownloader
|test.integ.descriptor.server_descriptor.TestServerDescriptor
|test.integ.descriptor.extrainfo_descriptor.TestExtraInfoDescriptor
diff --git a/test/unit/descriptor/__init__.py b/test/unit/descriptor/__init__.py
index a2c03f1d..c5cf01e1 100644
--- a/test/unit/descriptor/__init__.py
+++ b/test/unit/descriptor/__init__.py
@@ -6,6 +6,7 @@ import os
__all__ = [
'bandwidth_file',
+ 'collector',
'export',
'extrainfo_descriptor',
'microdescriptor',
diff --git a/test/unit/descriptor/collector.py b/test/unit/descriptor/collector.py
new file mode 100644
index 00000000..5dc12164
--- /dev/null
+++ b/test/unit/descriptor/collector.py
@@ -0,0 +1,16 @@
+"""
+Unit tests for stem.descriptor.collector.
+"""
+
+import unittest
+
+from stem.descriptor.collector import Compression, url
+
+
+class TestCollector(unittest.TestCase):
+ def test_url(self):
+ self.assertEqual('https://collector.torproject.org/index/index.json', url('index'))
+ self.assertEqual('https://collector.torproject.org/index/index.json', url('index', compression = Compression.NONE))
+ self.assertEqual('https://collector.torproject.org/index/index.json.gz', url('index', compression = Compression.GZ))
+ self.assertEqual('https://collector.torproject.org/index/index.json.bz2', url('index', compression = Compression.BZ2))
+ self.assertEqual('https://collector.torproject.org/index/index.json.xz', url('index', compression = Compression.XZ))
1
0
commit 6120d0603bacf439ea7f21c79c87d3dba4d1e68e
Author: Damian Johnson <atagar(a)torproject.org>
Date: Mon Dec 25 13:29:07 2017 -0800
Decompress bz2 responses
---
stem/descriptor/collector.py | 3 +++
test/integ/descriptor/collector.py | 7 ++++++-
2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/stem/descriptor/collector.py b/stem/descriptor/collector.py
index abd666ab..4af35827 100644
--- a/stem/descriptor/collector.py
+++ b/stem/descriptor/collector.py
@@ -50,6 +50,7 @@ With this you can either download and read directly from CollecTor...
.. versionadded:: 1.7.0
"""
+import bz2
import gzip
import io
import json
@@ -149,6 +150,8 @@ class CollecTor(object):
else:
# prior to python 3.2 gzip only had GzipFile
response = gzip.GzipFile(fileobj = io.BytesIO(response)).read()
+ elif self.compression == Compression.BZ2:
+ response = bz2.decompress(response)
self._cached_index = json.loads(stem.util.str_tools._to_unicode(response))
self._cached_index_at = time.time()
diff --git a/test/integ/descriptor/collector.py b/test/integ/descriptor/collector.py
index c481b8c7..d79197c2 100644
--- a/test/integ/descriptor/collector.py
+++ b/test/integ/descriptor/collector.py
@@ -18,7 +18,12 @@ class TestCollector(unittest.TestCase):
@test.require.only_run_once
@test.require.online
def test_index_gzip(self):
- self._test_index(Compression.NONE)
+ self._test_index(Compression.GZ)
+
+ @test.require.only_run_once
+ @test.require.online
+ def test_index_bz2(self):
+ self._test_index(Compression.BZ2)
def _test_index(self, compression):
collector = CollecTor(compression = compression)
1
0
commit b02231d2272ffda53a66cd6eb9fa454697c382b5
Author: Damian Johnson <atagar(a)torproject.org>
Date: Mon Dec 25 13:25:34 2017 -0800
Decompress gzip responses
Clearly not what we'll have long term, but does the trick to start.
---
stem/descriptor/collector.py | 13 ++++++++++++-
test/integ/descriptor/collector.py | 12 ++++++++++--
2 files changed, 22 insertions(+), 3 deletions(-)
diff --git a/stem/descriptor/collector.py b/stem/descriptor/collector.py
index ca0e6921..abd666ab 100644
--- a/stem/descriptor/collector.py
+++ b/stem/descriptor/collector.py
@@ -50,6 +50,8 @@ With this you can either download and read directly from CollecTor...
.. versionadded:: 1.7.0
"""
+import gzip
+import io
import json
import time
@@ -59,7 +61,9 @@ try:
except ImportError:
import urllib2 as urllib
+import stem.prereq
import stem.util.enum
+import stem.util.str_tools
Compression = stem.util.enum.Enum('NONE', 'BZ2', 'GZ', 'XZ')
@@ -139,7 +143,14 @@ class CollecTor(object):
# TODO: add compression and retry support
- self._cached_index = json.loads(response)
+ if self.compression == Compression.GZ:
+ if stem.prereq.is_python_3():
+ response = gzip.decompress(response)
+ else:
+ # prior to python 3.2 gzip only had GzipFile
+ response = gzip.GzipFile(fileobj = io.BytesIO(response)).read()
+
+ self._cached_index = json.loads(stem.util.str_tools._to_unicode(response))
self._cached_index_at = time.time()
return self._cached_index
diff --git a/test/integ/descriptor/collector.py b/test/integ/descriptor/collector.py
index 25f5d503..c481b8c7 100644
--- a/test/integ/descriptor/collector.py
+++ b/test/integ/descriptor/collector.py
@@ -12,8 +12,16 @@ from stem.descriptor.collector import CollecTor, Compression
class TestCollector(unittest.TestCase):
@test.require.only_run_once
@test.require.online
- def test_index(self):
- collector = CollecTor(compression = Compression.NONE)
+ def test_index_plaintext(self):
+ self._test_index(Compression.NONE)
+
+ @test.require.only_run_once
+ @test.require.online
+ def test_index_gzip(self):
+ self._test_index(Compression.NONE)
+
+ def _test_index(self, compression):
+ collector = CollecTor(compression = compression)
index = collector.index()
self.assertEqual('https://collector.torproject.org', index['path'])
1
0
commit db72d0480f0cc118018033d8f8e9d81a47c7d85a
Author: Damian Johnson <atagar(a)torproject.org>
Date: Mon Dec 25 13:30:16 2017 -0800
Rename gzip enum
The compression name is gzip, 'gz' is just its file extension.
---
stem/descriptor/collector.py | 6 +++---
test/integ/descriptor/collector.py | 2 +-
test/unit/descriptor/collector.py | 2 +-
3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/stem/descriptor/collector.py b/stem/descriptor/collector.py
index 4af35827..72ecfc30 100644
--- a/stem/descriptor/collector.py
+++ b/stem/descriptor/collector.py
@@ -66,15 +66,15 @@ import stem.prereq
import stem.util.enum
import stem.util.str_tools
-Compression = stem.util.enum.Enum('NONE', 'BZ2', 'GZ', 'XZ')
+Compression = stem.util.enum.Enum('NONE', 'GZIP', 'BZ2', 'XZ')
COLLECTOR_URL = 'https://collector.torproject.org/'
REFRESH_INDEX_RATE = 3600 # get new index if cached copy is an hour old
COMPRESSION_SUFFIX = {
Compression.NONE: '',
+ Compression.GZIP: '.gz',
Compression.BZ2: '.bz2',
- Compression.GZ: '.gz',
Compression.XZ: '.xz',
}
@@ -144,7 +144,7 @@ class CollecTor(object):
# TODO: add compression and retry support
- if self.compression == Compression.GZ:
+ if self.compression == Compression.GZIP:
if stem.prereq.is_python_3():
response = gzip.decompress(response)
else:
diff --git a/test/integ/descriptor/collector.py b/test/integ/descriptor/collector.py
index d79197c2..edb0d2e6 100644
--- a/test/integ/descriptor/collector.py
+++ b/test/integ/descriptor/collector.py
@@ -18,7 +18,7 @@ class TestCollector(unittest.TestCase):
@test.require.only_run_once
@test.require.online
def test_index_gzip(self):
- self._test_index(Compression.GZ)
+ self._test_index(Compression.GZIP)
@test.require.only_run_once
@test.require.online
diff --git a/test/unit/descriptor/collector.py b/test/unit/descriptor/collector.py
index 5dc12164..ce7f0f3c 100644
--- a/test/unit/descriptor/collector.py
+++ b/test/unit/descriptor/collector.py
@@ -11,6 +11,6 @@ class TestCollector(unittest.TestCase):
def test_url(self):
self.assertEqual('https://collector.torproject.org/index/index.json', url('index'))
self.assertEqual('https://collector.torproject.org/index/index.json', url('index', compression = Compression.NONE))
- self.assertEqual('https://collector.torproject.org/index/index.json.gz', url('index', compression = Compression.GZ))
+ self.assertEqual('https://collector.torproject.org/index/index.json.gz', url('index', compression = Compression.GZIP))
self.assertEqual('https://collector.torproject.org/index/index.json.bz2', url('index', compression = Compression.BZ2))
self.assertEqual('https://collector.torproject.org/index/index.json.xz', url('index', compression = Compression.XZ))
1
0
commit 25dbd741336e33ccda4f6ef848f3d3a9f769dbdf
Author: Damian Johnson <atagar(a)torproject.org>
Date: Mon Dec 25 14:23:16 2017 -0800
Decompress lzma responses
The lzma module is unavailable by default on python3 so adding some
autodetection, and in the process redoing our compression handling.
---
stem/descriptor/collector.py | 112 +++++++++++++++++++++++++++----------
test/integ/descriptor/collector.py | 16 ++++--
test/unit/descriptor/collector.py | 10 ++--
3 files changed, 100 insertions(+), 38 deletions(-)
diff --git a/stem/descriptor/collector.py b/stem/descriptor/collector.py
index 72ecfc30..1184c56e 100644
--- a/stem/descriptor/collector.py
+++ b/stem/descriptor/collector.py
@@ -50,8 +50,6 @@ With this you can either download and read directly from CollecTor...
.. versionadded:: 1.7.0
"""
-import bz2
-import gzip
import io
import json
import time
@@ -66,20 +64,73 @@ import stem.prereq
import stem.util.enum
import stem.util.str_tools
-Compression = stem.util.enum.Enum('NONE', 'GZIP', 'BZ2', 'XZ')
-
COLLECTOR_URL = 'https://collector.torproject.org/'
REFRESH_INDEX_RATE = 3600 # get new index if cached copy is an hour old
-COMPRESSION_SUFFIX = {
- Compression.NONE: '',
- Compression.GZIP: '.gz',
- Compression.BZ2: '.bz2',
- Compression.XZ: '.xz',
-}
+
+class Compression(object):
+ """
+ Compression method supported by CollecTor.
+
+ :var bool available: **True** if this method of decryption is available,
+ **False** otherwise
+ :var str extension: file extension of this compression
+ """
+
+ def __init__(self, module, extension):
+ # Compression modules are optional. Usually gzip and bz2 are available, but
+ # they might be missing if compiling python yourself. As for lzma it was
+ # added in python 3.3.
+
+ try:
+ self._module = __import__(module)
+ self.available = True
+ except ImportError:
+ self._module = None
+ self.available = False
+
+ self.extension = extension
+ self._module_name = module
+
+ def decompress(self, content):
+ """
+ Decompresses the given content via this method.
+
+ :param bytes content: content to be decompressed
+
+ :returns: **unicode** with the decompressed content
+
+ :raises: **ImportError** if this method if decompression is unavalable
+ """
+
+ if not self.available:
+ raise ImportError("'%s' decompression module is unavailable" % self)
+
+ if self._module_name == 'gzip':
+ if stem.prereq.is_python_3():
+ decompressed = self._module.decompress(content)
+ else:
+ # prior to python 3.2 gzip only had GzipFile
+ decompressed = self._module.GzipFile(fileobj = io.BytesIO(content)).read()
+ elif self._module_name == 'bz2':
+ decompressed = self._module.decompress(content)
+ elif self._module_name == 'lzma':
+ decompressed = self._module.decompress(content)
+ else:
+ raise ImportError("BUG: No implementation for %s decompression" % self)
+
+ return stem.util.str_tools._to_unicode(decompressed)
+
+ def __str__(self):
+ return self._module_name
-def url(resource, compression = Compression.NONE):
+GZIP = Compression('gzip', '.gz')
+BZ2 = Compression('bz2', '.bz2')
+LZMA = Compression('lzma', '.xz')
+
+
+def url(resource, compression = None):
"""
Provides CollecTor url for the given resource.
@@ -90,9 +141,6 @@ def url(resource, compression = Compression.NONE):
:returns: **str** with the CollecTor url
"""
- if compression not in COMPRESSION_SUFFIX:
- raise ValueError("'%s' isn't a compression enumeration" % compression)
-
# TODO: Not yet sure how to most elegantly map resources to urls. No doubt
# this'll change as we add more types.
@@ -101,7 +149,8 @@ def url(resource, compression = Compression.NONE):
else:
raise ValueError("'%s' isn't a recognized resource type" % resource)
- return ''.join((COLLECTOR_URL, '/'.join(path), COMPRESSION_SUFFIX[compression]))
+ suffix = compression.extension if compression else ''
+ return ''.join((COLLECTOR_URL, '/'.join(path), suffix))
class CollecTor(object):
@@ -111,14 +160,23 @@ class CollecTor(object):
that's fetched as required.
:var descriptor.collector.Compression compression: compression type to
- download from
+ download from, if undefiled we'll use the best decompression available
:var int retries: number of times to attempt the request if downloading it
fails
:var float timeout: duration before we'll time out our request
"""
- def __init__(self, compression = Compression.XZ, retries = 2, timeout = None):
- self.compression = compression
+ def __init__(self, compression = 'best', retries = 2, timeout = None):
+ if compression == 'best':
+ self.compression = None
+
+ for option in (LZMA, BZ2, GZIP):
+ if option.available:
+ self.compression = option
+ break
+ else:
+ self.compression = compression
+
self.retries = retries
self.timeout = timeout
@@ -140,20 +198,16 @@ class CollecTor(object):
"""
if not self._cached_index or time.time() - self._cached_index_at >= REFRESH_INDEX_RATE:
- response = urllib.urlopen(url('index', self.compression), timeout = self.timeout).read()
+ # TODO: add retry support
- # TODO: add compression and retry support
+ response_bytes = urllib.urlopen(url('index', self.compression), timeout = self.timeout).read()
- if self.compression == Compression.GZIP:
- if stem.prereq.is_python_3():
- response = gzip.decompress(response)
- else:
- # prior to python 3.2 gzip only had GzipFile
- response = gzip.GzipFile(fileobj = io.BytesIO(response)).read()
- elif self.compression == Compression.BZ2:
- response = bz2.decompress(response)
+ if self.compression:
+ response = self.compression.decompress(response_bytes)
+ else:
+ response = stem.util.str_tools._to_unicode(response_bytes)
- self._cached_index = json.loads(stem.util.str_tools._to_unicode(response))
+ self._cached_index = json.loads(response)
self._cached_index_at = time.time()
return self._cached_index
diff --git a/test/integ/descriptor/collector.py b/test/integ/descriptor/collector.py
index edb0d2e6..3233f2e5 100644
--- a/test/integ/descriptor/collector.py
+++ b/test/integ/descriptor/collector.py
@@ -6,26 +6,34 @@ import unittest
import test.require
-from stem.descriptor.collector import CollecTor, Compression
+from stem.descriptor.collector import GZIP, BZ2, LZMA, CollecTor
class TestCollector(unittest.TestCase):
@test.require.only_run_once
@test.require.online
def test_index_plaintext(self):
- self._test_index(Compression.NONE)
+ self._test_index(None)
@test.require.only_run_once
@test.require.online
def test_index_gzip(self):
- self._test_index(Compression.GZIP)
+ self._test_index(GZIP)
@test.require.only_run_once
@test.require.online
def test_index_bz2(self):
- self._test_index(Compression.BZ2)
+ self._test_index(BZ2)
+
+ @test.require.only_run_once
+ @test.require.online
+ def test_index_lzma(self):
+ self._test_index(LZMA)
def _test_index(self, compression):
+ if compression and not compression.available:
+ self.skipTest('(%s unavailable)' % compression)
+
collector = CollecTor(compression = compression)
index = collector.index()
diff --git a/test/unit/descriptor/collector.py b/test/unit/descriptor/collector.py
index ce7f0f3c..f09d5b9d 100644
--- a/test/unit/descriptor/collector.py
+++ b/test/unit/descriptor/collector.py
@@ -4,13 +4,13 @@ Unit tests for stem.descriptor.collector.
import unittest
-from stem.descriptor.collector import Compression, url
+from stem.descriptor.collector import GZIP, BZ2, LZMA, url
class TestCollector(unittest.TestCase):
def test_url(self):
self.assertEqual('https://collector.torproject.org/index/index.json', url('index'))
- self.assertEqual('https://collector.torproject.org/index/index.json', url('index', compression = Compression.NONE))
- self.assertEqual('https://collector.torproject.org/index/index.json.gz', url('index', compression = Compression.GZIP))
- self.assertEqual('https://collector.torproject.org/index/index.json.bz2', url('index', compression = Compression.BZ2))
- self.assertEqual('https://collector.torproject.org/index/index.json.xz', url('index', compression = Compression.XZ))
+ self.assertEqual('https://collector.torproject.org/index/index.json', url('index', compression = None))
+ self.assertEqual('https://collector.torproject.org/index/index.json.gz', url('index', compression = GZIP))
+ self.assertEqual('https://collector.torproject.org/index/index.json.bz2', url('index', compression = BZ2))
+ self.assertEqual('https://collector.torproject.org/index/index.json.xz', url('index', compression = LZMA))
1
0
commit 97c23c831e131e849a433054bb6653c8165a78f7
Author: Damian Johnson <atagar(a)torproject.org>
Date: Mon Dec 25 14:39:52 2017 -0800
Unit test for CollecTor index method
Initial method for the index method. Mocking CollecTor responses will not only
be quicker, but let us exercise more scenarios.
---
stem/descriptor/collector.py | 2 +-
test/unit/descriptor/collector.py | 24 +++++++++++++++++++++++-
2 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/stem/descriptor/collector.py b/stem/descriptor/collector.py
index 1184c56e..c6d70544 100644
--- a/stem/descriptor/collector.py
+++ b/stem/descriptor/collector.py
@@ -117,7 +117,7 @@ class Compression(object):
elif self._module_name == 'lzma':
decompressed = self._module.decompress(content)
else:
- raise ImportError("BUG: No implementation for %s decompression" % self)
+ raise ImportError('BUG: No implementation for %s decompression' % self)
return stem.util.str_tools._to_unicode(decompressed)
diff --git a/test/unit/descriptor/collector.py b/test/unit/descriptor/collector.py
index f09d5b9d..01f8f6ee 100644
--- a/test/unit/descriptor/collector.py
+++ b/test/unit/descriptor/collector.py
@@ -2,9 +2,20 @@
Unit tests for stem.descriptor.collector.
"""
+import io
import unittest
-from stem.descriptor.collector import GZIP, BZ2, LZMA, url
+import stem.prereq
+
+from stem.descriptor.collector import GZIP, BZ2, LZMA, CollecTor, url
+
+try:
+ # added in python 3.3
+ from unittest.mock import Mock, patch
+except ImportError:
+ from mock import Mock, patch
+
+URL_OPEN = 'urllib.request.urlopen' if stem.prereq.is_python_3() else 'urllib2.urlopen'
class TestCollector(unittest.TestCase):
@@ -14,3 +25,14 @@ class TestCollector(unittest.TestCase):
self.assertEqual('https://collector.torproject.org/index/index.json.gz', url('index', compression = GZIP))
self.assertEqual('https://collector.torproject.org/index/index.json.bz2', url('index', compression = BZ2))
self.assertEqual('https://collector.torproject.org/index/index.json.xz', url('index', compression = LZMA))
+
+ @patch(URL_OPEN, Mock(return_value = io.BytesIO(b'{"index_created":"2017-12-25 21:06","build_revision":"56a303e","path":"https://collector.torproject.org"}')))
+ def test_index(self):
+ expected = {
+ 'index_created': '2017-12-25 21:06',
+ 'build_revision': '56a303e',
+ 'path': 'https://collector.torproject.org'
+ }
+
+ collector = CollecTor(compression = None)
+ self.assertEqual(expected, collector.index())
1
0
commit d0ec0cdc476151a4e698867a47f1c3ffc4662fdb
Author: Damian Johnson <atagar(a)torproject.org>
Date: Mon Dec 25 17:32:22 2017 -0800
Test index request failures
---
stem/descriptor/collector.py | 14 +++++++++++---
test/unit/descriptor/collector.py | 15 +++++++++++++++
2 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/stem/descriptor/collector.py b/stem/descriptor/collector.py
index 5d65fd65..2360d827 100644
--- a/stem/descriptor/collector.py
+++ b/stem/descriptor/collector.py
@@ -100,7 +100,11 @@ class Compression(object):
:returns: **bytes** with the decompressed content
- :raises: **ImportError** if this method if decompression is unavalable
+ :raises:
+ If unable to decompress this provide...
+
+ * **IOError** if content isn't compressed with this
+ * **ImportError** if this method if decompression is unavalable
"""
if not self.available:
@@ -190,7 +194,8 @@ class CollecTor(object):
:raises:
If unable to retrieve the index this provide...
- * **ValueError** if the index is malformed
+ * **ValueError** if json is malformed
+ * **IOError** if unable to decompress
* **socket.timeout** if our request timed out
* **urllib2.URLError** for most request failures
"""
@@ -201,7 +206,10 @@ class CollecTor(object):
response = urllib.urlopen(url('index', self.compression), timeout = self.timeout).read()
if self.compression:
- response = self.compression.decompress(response)
+ try:
+ response = self.compression.decompress(response)
+ except Exception as exc:
+ raise IOError('Unable to decompress response as %s: %s' % (self.compression, exc))
self._cached_index = json.loads(stem.util.str_tools._to_unicode(response))
self._cached_index_at = time.time()
diff --git a/test/unit/descriptor/collector.py b/test/unit/descriptor/collector.py
index 01f8f6ee..a0f8cb2e 100644
--- a/test/unit/descriptor/collector.py
+++ b/test/unit/descriptor/collector.py
@@ -36,3 +36,18 @@ class TestCollector(unittest.TestCase):
collector = CollecTor(compression = None)
self.assertEqual(expected, collector.index())
+
+ @patch(URL_OPEN, Mock(return_value = io.BytesIO(b'not json')))
+ def test_index_malformed_json(self):
+ collector = CollecTor(compression = None)
+
+ if stem.prereq.is_python_3():
+ self.assertRaisesRegexp(ValueError, 'Expecting value: line 1 column 1', collector.index)
+ else:
+ self.assertRaisesRegexp(ValueError, 'No JSON object could be decoded', collector.index)
+
+ def test_index_malformed_compression(self):
+ for compression in (GZIP, BZ2, LZMA):
+ with patch(URL_OPEN, Mock(return_value = io.BytesIO(b'not compressed'))):
+ collector = CollecTor(compression = compression)
+ self.assertRaisesRegexp(IOError, 'Unable to decompress response as %s' % compression, collector.index)
1
0