Browse code

update the mirrors page, have the script update the csv list with last status.

Andrew Lewman authored on 06/12/2013 16:54:04
Showing 1 changed files
... ...
@@ -121,7 +121,7 @@ sub LoadMirrors {
121 121
 
122 122
 sub DumpMirrors {
123 123
     my @m = @_;
124
-    open(CSV, ">", "tor-mirrors.csv") or die "Cannot open tor-mirrors.csv: $!";
124
+    open(CSV, ">", "include/tor-mirrors.csv") or die "Cannot open tor-mirrors.csv: $!";
125 125
     print CSV join(", ", @columns) . "\n";
126 126
     foreach my $server(@m) {
127 127
 	$server->{updateDate} = gmtime($server->{updateDate}) if ($server->{updateDate});
... ...
@@ -153,7 +153,7 @@ print "Using these files for sig matching:\n";
153 153
 print join("\n", keys %randomtorfiles);
154 154
 print "\n";
155 155
 
156
-# Adjust offical Tor time by out-of-date offset: number of days * seconds per day
156
+# Adjust official Tor time by out-of-date offset: number of days * seconds per day
157 157
 $tortime -= 1 * 172800;
158 158
 print "The official time for Tor is $tortime. \n";
159 159
 
... ...
@@ -184,15 +184,11 @@ for(my $server = 0; $server < scalar(@m); $server++) {
184 184
 
185 185
 sub PrintServer {
186 186
      my $server = shift;
187
-     my $time;
188
-     if ( $server->{updateDate} && $server->{sigMatched} ) { $time = "Up to date"; } 
189
-     elsif (!$server->{updateDate}) 			   { $time = "Unknown"; }
190
-     else 			    			   { $time = "Failed signature check"; }
191 187
 print OUT <<"END";
192 188
      \n<tr>\n
193 189
          <td>$server->{isoCC}</td>\n
194 190
          <td>$server->{orgName}</td>\n
195
-         <td>$time</td>\n
191
+         <td>Up to date</td>\n
196 192
 END
197 193
 
198 194
      my %prettyNames = (
... ...
@@ -224,13 +220,6 @@ open(OUT, "> $outFile") or die "Can't open $outFile: $!";
224 220
 foreach my $server ( sort { $b->{updateDate} <=> $a->{updateDate} } grep {$_->{updateDate} && $_->{updateDate} > $tortime && $_->{sigMatched}} @m ) {
225 221
     PrintServer($server);
226 222
 }
227
-foreach my $server ( grep {!$_->{updateDate}}  @m ) {
228
-    PrintServer($server);
229
-}
230
-foreach my $server ( grep {!$_->{sigMatched} && $_->{updateDate} && $_->{updateDate} > $tortime} @m ) {
231
-    PrintServer($server);
232
-}
233
-# That leaves those servers whose updateDate < torTime. Check the csv for those.
234 223
 
235 224
 DumpMirrors(@m);
236 225
 
Browse code

update mirror script again, run it and update mirrors table.

Andrew Lewman authored on 06/12/2013 04:49:41
Showing 1 changed files
... ...
@@ -59,26 +59,31 @@ sub ExtractDate {
59 59
     my $date    = str2time($content);
60 60
 
61 61
     if ($date) {
62
-    	print "ExtractDate($content) = $date\n";
62
+    	print "\tExtractDate($content) = $date\n";
63 63
         return $date;
64 64
     } else {
65
-    	print "ExtractDate($content) = ?\n";
65
+    	print "\tExtractDate($content) = ?\n";
66 66
 	return undef;
67 67
     }
68 68
 }
69 69
 
70 70
 sub ExtractSig {
71
-    my $content = shift;
72
-    return sha256_hex($content); 
71
+    my $content = shift; 
72
+    my $url     = shift;
73
+    my $sig = sha256_hex($content);
74
+    print "\tExtractSig($url) = $sig\n";
75
+    return $sig;
73 76
 }
74 77
 
75 78
 sub Fetch {
76 79
     my ($url, $sub) = @_; # Base url for mirror
80
+    $|++; # unbuffer stdout to show progress
77 81
 
82
+    print "\nGET $url: ";
78 83
     my $request = new HTTP::Request GET => "$url";
79 84
     my $result = $lua->request($request);
80 85
     my $code = $result->code();
81
-    print "\nGET $url: $code\n";
86
+    print "$code\n";
82 87
 
83 88
     if ($result->is_success && $code eq "200"){
84 89
        my $content = $result->content;
... ...
@@ -146,8 +151,9 @@ for (1 .. 1)
146 151
 
147 152
 print "Using these files for sig matching:\n";
148 153
 print join("\n", keys %randomtorfiles);
154
+print "\n";
149 155
 
150
-# Adjust official Tor time by out-of-date offset: number of days * seconds per day
156
+# Adjust offical Tor time by out-of-date offset: number of days * seconds per day
151 157
 $tortime -= 1 * 172800;
152 158
 print "The official time for Tor is $tortime. \n";
153 159
 
... ...
@@ -163,12 +169,10 @@ for(my $server = 0; $server < scalar(@m); $server++) {
163 169
                 foreach my $randomtorfile(keys %randomtorfiles) {
164 170
                     my $sig = Fetch("$m[$server]->{$serverType}/$randomtorfile", \&ExtractSig);
165 171
             	    if (!$sig) {
166
-		        print STDERR "Unreadable $randomtorfile on $m[$server]->{$serverType}";
167 172
 			$m[$server]->{sigMatched} = 0;
168 173
             	    	last;
169 174
 		    } elsif ($sig ne $randomtorfiles{$randomtorfile}) {
170 175
 			$m[$server]->{sigMatched} = 0;
171
-		        print STDERR "Sig mismatch of $randomtorfile on $m[$server]->{$serverType}";
172 176
             	    	last;
173 177
             	    }
174 178
 		}
... ...
@@ -181,15 +185,13 @@ for(my $server = 0; $server < scalar(@m); $server++) {
181 185
 sub PrintServer {
182 186
      my $server = shift;
183 187
      my $time;
184
-     if ( $server->{'updateDate'} ) {
185
-	  if ( $server->{'updateDate'} > $tortime ) {
186
-	    $time = "Up to date";
187
-	  } else { $time = "DO NOT USE. Out of date."; }
188
-     } else { $time = "Unknown"; }
188
+     if ( $server->{updateDate} && $server->{sigMatched} ) { $time = "Up to date"; } 
189
+     elsif (!$server->{updateDate}) 			   { $time = "Unknown"; }
190
+     else 			    			   { $time = "Failed signature check"; }
189 191
 print OUT <<"END";
190 192
      \n<tr>\n
191
-         <td>$server->{'isoCC'}</td>\n
192
-         <td>$server->{'orgName'}</td>\n
193
+         <td>$server->{isoCC}</td>\n
194
+         <td>$server->{orgName}</td>\n
193 195
          <td>$time</td>\n
194 196
 END
195 197
 
... ...
@@ -204,7 +206,7 @@ END
204 206
 
205 207
      foreach my $precious ( sort keys %prettyNames )
206 208
      {
207
-        if ($server->{"$precious"}) {
209
+        if ($server->{$precious}) {
208 210
             print OUT "    <td><a href=\"" . $server->{$precious} . "\">" .
209 211
                       "$prettyNames{$precious}</a></td>\n";
210 212
         } else { print OUT "    <td> - </td>\n"; }
... ...
@@ -219,12 +221,16 @@ open(OUT, "> $outFile") or die "Can't open $outFile: $!";
219 221
 
220 222
 # Here's where we open a file and print some wml include goodness
221 223
 # This is sorted from last known recent update to unknown update times
222
-foreach my $server ( sort { $b->{'updateDate'} <=> $a->{'updateDate'}} grep {$_->{updateDate} && $_->{sigMatched}} @m ) {
224
+foreach my $server ( sort { $b->{updateDate} <=> $a->{updateDate} } grep {$_->{updateDate} && $_->{updateDate} > $tortime && $_->{sigMatched}} @m ) {
225
+    PrintServer($server);
226
+}
227
+foreach my $server ( grep {!$_->{updateDate}}  @m ) {
223 228
     PrintServer($server);
224 229
 }
225
-foreach my $server ( grep {!$_->{updateDate} || !$_->{sigMatched}} @m ) {
230
+foreach my $server ( grep {!$_->{sigMatched} && $_->{updateDate} && $_->{updateDate} > $tortime} @m ) {
226 231
     PrintServer($server);
227 232
 }
233
+# That leaves those servers whose updateDate < torTime. Check the csv for those.
228 234
 
229 235
 DumpMirrors(@m);
230 236
 
Browse code

update the script some more, do a trial run and update of the live mirrors-table.

Andrew Lewman authored on 05/12/2013 18:11:12
Showing 1 changed files
... ...
@@ -45,7 +45,7 @@ sub ExtractLinks {
45 45
          	push @links, Fetch($attr_value, \&ExtractLinks);
46 46
          }
47 47
 	 elsif ($attr_value =~ /\.(xpi|dmg|exe|tar\.gz)$/)
48
-	 #elsif ($attr_value =~ /\.(asc)$/)
48
+	 #elsif ($attr_value =~ /\.(asc)$/) # small pgp files easier to test with
49 49
          {
50 50
          	push @links, $attr_value;
51 51
          }
... ...
@@ -58,12 +58,11 @@ sub ExtractDate {
58 58
     $content    = sanitize($content);
59 59
     my $date    = str2time($content);
60 60
 
61
-    print "Extracting possible date from: $content\n";
62 61
     if ($date) {
63
-        print "We've fetched a date $date.\n";
62
+    	print "ExtractDate($content) = $date\n";
64 63
         return $date;
65 64
     } else {
66
-        print "We haven't fetched a date.\n";
65
+    	print "ExtractDate($content) = ?\n";
67 66
 	return undef;
68 67
     }
69 68
 }
... ...
@@ -75,12 +74,11 @@ sub ExtractSig {
75 74
 
76 75
 sub Fetch {
77 76
     my ($url, $sub) = @_; # Base url for mirror
78
-    print "Fetch $url\n";
79 77
 
80 78
     my $request = new HTTP::Request GET => "$url";
81 79
     my $result = $lua->request($request);
82 80
     my $code = $result->code();
83
-    print "\tResult code $code\n";
81
+    print "\nGET $url: $code\n";
84 82
 
85 83
     if ($result->is_success && $code eq "200"){
86 84
        my $content = $result->content;
... ...
@@ -89,1286 +87,52 @@ sub Fetch {
89 87
         } else {
90 88
             print "Unable to fetch $url, empty content returned.\n";
91 89
         }
92
-
93
-    } else {
94
-       print "Our request failed, we had no result.\n";
95 90
     }
96 91
 
97 92
     return undef;
98 93
 }
94
+my @columns;
95
+sub LoadMirrors {
96
+    open(CSV, "<", "include/tor-mirrors.csv") or die "Cannot open tor-mirrors.csv: $!"; 
97
+    my $line = <CSV>;
98
+    chomp($line);
99
+    @columns = split(/\s*,\s*/, $line);
100
+    my @mirrors;
101
+    while ($line = <CSV>)
102
+    {
103
+        chomp($line);
104
+	my @values = split(/\s*,\s*/, $line);
105
+	my %server;
106
+	for (my $i = 0; $i < scalar(@columns); $i++)
107
+	{
108
+	    $server{$columns[$i]} = $values[$i] || '';
109
+	}
110
+	$server{updateDate} = str2time($server{updateDate}) if ($server{updateDate});
111
+	push @mirrors, {%server};
112
+    }
113
+    close(CSV);
114
+    return @mirrors;
115
+}
99 116
 
100
-# This is the list of all known Tor mirrors
101
-# Add new mirrors to the bottom!
102
-my %m = (
103
-
104
-
105
-        mirror000 => {
106
-            adminContact => "coralcdn.org",
107
-            orgName => "CoralCDN",
108
-            isoCC => "INT",
109
-            subRegion => "",
110
-            region => "INT",
111
-            ipv4 => "True",
112
-            ipv6 => "False",
113
-            loadBalanced => "Yes",
114
-            httpWebsiteMirror => "http://www.torproject.org.nyud.net/",
115
-            httpsWebsiteMirror => "",
116
-            rsyncWebsiteMirror => "",
117
-            ftpWebsiteMirror => "",
118
-            httpDistMirror => "http://www.torproject.org.nyud.net/dist/",
119
-            httpsDistMirror => "",
120
-            rsyncDistMirror => "",
121
-            hiddenServiceMirror => ""
122
-        },
123
-
124
-        mirror001 => {
125
-            adminContact => "BarkerJr AT barkerjr DOT net",
126
-            orgName => "BarkerJr",
127
-            isoCC => "FR",
128
-            subRegion => "",
129
-            region => "FR",
130
-            ipv4 => "True",
131
-            ipv6 => "False",
132
-            loadBalanced => "No",
133
-            httpWebsiteMirror => "http://www.oignon.net/",
134
-            httpsWebsiteMirror => "https://www.oignon.net/",
135
-            rsyncWebsiteMirror => "",
136
-            ftpWebsiteMirror => "",
137
-            httpDistMirror => "http://www.oignon.net/dist/",
138
-            httpsDistMirror => "https://www.oignon.net/dist/",
139
-            rsyncDistMirror => "",
140
-            hiddenServiceMirror => ""
141
-        },
142
-
143
-       mirror003 => {
144
-            adminContact => "citizen428 AT gmail DOT com",
145
-            orgName => "[[:bbs:]]",
146
-            isoCC => "DE",
147
-            subRegion => "",
148
-            region => "Europe",
149
-            ipv4 => "True",
150
-            ipv6 => "False",
151
-            loadBalanced => "Unknown",
152
-            httpWebsiteMirror => "http://tor.blingblingsquad.net/",
153
-            httpsWebsiteMirror => "https://tor.blingblingsquad.net/",
154
-            ftpWebsiteMirror => "",
155
-            rsyncWebsiteMirror => "",
156
-            httpDistMirror => "http://tor.blingblingsquad.net/dist/",
157
-            httpsDistMirror => "https://tor.blingblingsquad.net/dist/",
158
-            rsyncDistMirror => ""
159
-        },
160
-
161
-       mirror007 => {
162
-            adminContact => "info AT zentrum-der-gesundheit DOT de",
163
-            orgName => "Zentrum der Gesundheit",
164
-            isoCC => "DK",
165
-            subRegion => "",
166
-            region => "Europe",
167
-            ipv4 => "True",
168
-            ipv6 => "False",
169
-            loadBalanced => "Unknown",
170
-            httpWebsiteMirror => "http://tor.idnr.ws/",
171
-            ftpWebsiteMirror => "",
172
-            rsyncWebsiteMirror => "",
173
-            httpDistMirror => "http://tor.idnr.ws/dist/",
174
-            rsyncDistMirror => ""
175
-        },
176
-
177
-       mirror008 => {
178
-            adminContact => "root AT amorphis DOT eu",
179
-            orgName => "Amorphis",
180
-            isoCC => "NL",
181
-            subRegion => "",
182
-            region => "Europe",
183
-            ipv4 => "True",
184
-            ipv6 => "False",
185
-            loadBalanced => "Unknown",
186
-            httpWebsiteMirror => "http://tor.amorphis.eu/",
187
-            rsyncWebsiteMirror => "",
188
-            ftpWebsiteMirror => "",
189
-            httpDistMirror => "http://tor.amorphis.eu/dist/",
190
-            rsyncDistMirror => ""
191
-        },
192
-       mirror010 => {
193
-            adminContact => "webmaster AT ccc DOT de",
194
-            orgName => "CCC",
195
-            isoCC => "NL",
196
-            subRegion => "",
197
-            region => "Europe",
198
-            ipv4 => "True",
199
-            ipv6 => "False",
200
-            loadBalanced => "Unknown",
201
-            httpWebsiteMirror => "http://tor.ccc.de/",
202
-            rsyncWebsiteMirror => "",
203
-            ftpWebsiteMirror => "",
204
-            httpDistMirror => "http://tor.ccc.de/dist/",
205
-            rsyncDistMirror => ""
206
-        },
207
-
208
-       mirror013 => {
209
-	    adminContact => "hostmaster AT zombiewerks DOT com",
210
-            orgName => "TheOnionRouter",
211
-            isoCC => "IS",
212
-            subRegion => "",
213
-            region => "Iceland",
214
-            ipv4 => "True",
215
-            ipv6 => "False",
216
-            loadBalanced => "Unknown",
217
-            httpWebsiteMirror => "http://theonionrouter.com/",
218
-            httpsWebsiteMirror => "",
219
-            rsyncWebsiteMirror => "",
220
-            ftpWebsiteMirror => "",
221
-            httpDistMirror => "http://theonionrouter.com/dist/",
222
-            httpsDistMirror => "",
223
-            rsyncDistMirror => ""
224
-        },
225
-    mirror014 => {
226
-        adminContact => "tormaster AT xpdm DOT us",
227
-        orgName => "Xpdm",
228
-        isoCC => "US",
229
-        subRegion => "",
230
-        region => "North America",
231
-        ipv4 => "True",
232
-        ipv6 => "False",
233
-        loadBalanced => "Unknown",
234
-        httpWebsiteMirror => "http://torproj.xpdm.us/",
235
-        httpsWebsiteMirror => "https://torproj.xpdm.us/",
236
-        rsyncWebsiteMirror => "",
237
-        ftpWebsiteMirror => "",
238
-        httpDistMirror => "http://torproj.xpdm.us/dist/",
239
-        httpsDistMirror => "https://torproj.xpdm.us/dist/",
240
-        rsyncDistMirror => "",
241
-        hiddenServiceMirror => "http://h3prhz46uktgm4tt.onion/"
242
-        },
243
-     mirror016 => {
244
-            adminContact => "security AT hostoffice DOT hu",
245
-            orgName => "Unknown",
246
-            isoCC => "HU",
247
-            subRegion => "Hungary",
248
-            region => "Europe",
249
-            ipv4 => "True",
250
-            ipv6 => "False",
251
-            loadBalanced => "No",
252
-            httpWebsiteMirror => "http://mirror.tor.hu/",
253
-            httpsWebsiteMirror => "",
254
-            rsyncWebsiteMirror => "",
255
-            ftpWebsiteMirror => "",
256
-            httpDistMirror => "http://mirror.tor.hu/dist/",
257
-            httpsDistMirror => "",
258
-            rsyncDistMirror => "",
259
-            hiddenServiceMirror => ""
260
-        },
261
-   mirror018 => {
262
-            adminContact => "",
263
-            orgName => "chaos darmstadt",
264
-            isoCC => "DE",
265
-            subRegion => "Germany",
266
-            region => "Europe",
267
-            ipv4 => "True",
268
-            ipv6 => "False",
269
-            loadBalanced => "No",
270
-            httpWebsiteMirror => "http://mirrors.chaos-darmstadt.de/tor-mirror/",
271
-            httpsWebsiteMirror => "",
272
-            rsyncWebsiteMirror => "",
273
-            ftpWebsiteMirror => "",
274
-            httpDistMirror => "http://mirrors.chaos-darmstadt.de/tor-mirror/dist/",
275
-            httpsDistMirror => "",
276
-            rsyncDistMirror => "",
277
-            hiddenServiceMirror => ""
278
-        },
279
-
280
-	mirror019 => {
281
-            adminContact => "webmaster AT askapache DOT com",
282
-            orgName => "AskApache",
283
-            isoCC => "US",
284
-            subRegion => "California",
285
-            region => "US",
286
-            ipv4 => "True",
287
-            ipv6 => "False",
288
-            loadBalanced => "No",
289
-            httpWebsiteMirror => "http://tor.askapache.com/",
290
-            httpsWebsiteMirror => "",
291
-            rsyncWebsiteMirror => "",
292
-            ftpWebsiteMirror => "",
293
-            httpDistMirror => "http://tor.askapache.com/dist/",
294
-            httpsDistMirror => "",
295
-            rsyncDistMirror => "",
296
-            hiddenServiceMirror => ""
297
-        },
298
-
299
-	mirror020 => {
300
-            adminContact => " mail AT benjamin-meier DOT info ",
301
-            orgName => "beme it",
302
-            isoCC => "DE",
303
-            subRegion => "",
304
-            region => "DE",
305
-            ipv4 => "True",
306
-            ipv6 => "False",
307
-            loadBalanced => "No",
308
-            httpWebsiteMirror => "http://tor.beme-it.de/",
309
-            httpsWebsiteMirror => "https://tor.beme-it.de/",
310
-            rsyncWebsiteMirror => "rsync://tor.beme-it.de/tor",
311
-            ftpWebsiteMirror => "",
312
-            httpDistMirror => "http://tor.beme-it.de/dist/",
313
-            httpsDistMirror => "https://tor.beme-it.de/dist/",
314
-            rsyncDistMirror => "rsync://tor.beme-it.de/tor/dist",
315
-            hiddenServiceMirror => ""
316
-        },
317
-
318
-        mirror021 => {
319
-            adminContact => "",
320
-            orgName => "India Tor Fans",
321
-            isoCC => "IN",
322
-            subRegion => "",
323
-            region => "IN",
324
-            ipv4 => "True",
325
-            ipv6 => "False",
326
-            loadBalanced => "No",
327
-            httpWebsiteMirror => "http://www.torproject.org.in/",
328
-            httpsWebsiteMirror => "",
329
-            rsyncWebsiteMirror => "",
330
-            ftpWebsiteMirror => "",
331
-            httpDistMirror => "http://www.torproject.org.in/dist/",
332
-            httpsDistMirror => "",
333
-            rsyncDistMirror => "",
334
-            hiddenServiceMirror => ""
335
-        },
336
-
337
-        mirror024 => {
338
-            adminContact => "",
339
-            orgName => "homosu",
340
-            isoCC => "SE",
341
-            subRegion => "",
342
-            region => "SE",
343
-            ipv4 => "True",
344
-            ipv6 => "False",
345
-            loadBalanced => "No",
346
-            httpWebsiteMirror => "http://tor.homosu.net/",
347
-            httpsWebsiteMirror => "",
348
-            rsyncWebsiteMirror => "",
349
-            ftpWebsiteMirror => "",
350
-            httpDistMirror => "http://tor.homosu.net/dist/",
351
-            httpsDistMirror => "",
352
-            rsyncDistMirror => "",
353
-            hiddenServiceMirror => ""
354
-        },
355
-
356
-        mirror025 => {
357
-            adminContact => "margus.random at mail.ee",
358
-            orgName => "CyberSIDE",
359
-            isoCC => "EE",
360
-            subRegion => "",
361
-            region => "EE",
362
-            ipv4 => "True",
363
-            ipv6 => "False",
364
-            loadBalanced => "No",
365
-            httpWebsiteMirror => "http://cyberside.planet.ee/tor/",
366
-            httpsWebsiteMirror => "",
367
-            rsyncWebsiteMirror => "",
368
-            ftpWebsiteMirror => "",
369
-            httpDistMirror => "http://cyberside.net.ee/tor/",
370
-            httpsDistMirror => "",
371
-            rsyncDistMirror => "",
372
-            hiddenServiceMirror => ""
373
-        },
374
-
375
-        mirror028 => {
376
-            adminContact => "",
377
-            orgName => "NW Linux",
378
-            isoCC => "US",
379
-            subRegion => "WA",
380
-            region => "US",
381
-            ipv4 => "True",
382
-            ipv6 => "False",
383
-            loadBalanced => "No",
384
-            httpWebsiteMirror => "http://torproject.nwlinux.us/",
385
-            httpsWebsiteMirror => "",
386
-            rsyncWebsiteMirror => "rsync://nwlinux.us/tor-web",
387
-            ftpWebsiteMirror => "",
388
-            httpDistMirror => "http://torproject.nwlinux.us/dist/",
389
-            httpsDistMirror => "",
390
-            rsyncDistMirror => "rsync://nwlinux.us/tor-dist",
391
-            hiddenServiceMirror => "",
392
-        },
393
-        mirror029 => {
394
-            adminContact => "",
395
-            orgName => "LazyTiger",
396
-            isoCC => "FR",
397
-            subRegion => "",
398
-            region => "FR",
399
-            ipv4 => "True",
400
-            ipv6 => "False",
401
-            loadBalanced => "No",
402
-            httpWebsiteMirror => "http://tor.taiga-san.net/",
403
-            httpsWebsiteMirror => "",
404
-            rsyncWebsiteMirror => "",
405
-            ftpWebsiteMirror => "",
406
-            httpDistMirror => "http://tor.taiga-san.net/dist/",
407
-            httpsDistMirror => "",
408
-            rsyncDistMirror => "",
409
-            hiddenServiceMirror => "",
410
-        },
411
-        mirror030 => {
412
-            adminContact => "",
413
-            orgName => "searchprivate",
414
-            isoCC => "US",
415
-            subRegion => "TX",
416
-            region => "US",
417
-            ipv4 => "True",
418
-            ipv6 => "False",
419
-            loadBalanced => "No",
420
-            httpWebsiteMirror => "http://tor.searchprivate.com/",
421
-            httpsWebsiteMirror => "",
422
-            rsyncWebsiteMirror => "",
423
-            ftpWebsiteMirror => "",
424
-            httpDistMirror => "http://tor.searchprivate.com/dist/",
425
-            httpsDistMirror => "",
426
-            rsyncDistMirror => "",
427
-            hiddenServiceMirror => "",
428
-        },
429
-        mirror031 => {
430
-            adminContact => "",
431
-            orgName => "cyberarmy",
432
-            isoCC => "AT",
433
-            subRegion => "",
434
-            region => "AT",
435
-            ipv4 => "True",
436
-            ipv6 => "False",
437
-            loadBalanced => "No",
438
-            httpWebsiteMirror => "http://tor.cyberarmy.at/",
439
-            httpsWebsiteMirror => "",
440
-            rsyncWebsiteMirror => "",
441
-            ftpWebsiteMirror => "",
442
-            httpDistMirror => "",
443
-            httpsDistMirror => "",
444
-            rsyncDistMirror => "",
445
-            hiddenServiceMirror => "",
446
-        },
447
-        mirror032 => {
448
-            adminContact => "",
449
-            orgName => "torproject.is",
450
-            isoCC => "IS",
451
-            subRegion => "",
452
-            region => "IS",
453
-            ipv4 => "True",
454
-            ipv6 => "False",
455
-            loadBalanced => "No",
456
-            httpWebsiteMirror => "http://torproject.is/",
457
-            httpsWebsiteMirror => "",
458
-            rsyncWebsiteMirror => "",
459
-            ftpWebsiteMirror => "",
460
-            httpDistMirror => "http://torproject.is/dist/",
461
-            httpsDistMirror => "",
462
-            rsyncDistMirror => "",
463
-            hiddenServiceMirror => "",
464
-        },
465
-        mirror033 => {
466
-            adminContact => "",
467
-            orgName => "torservers",
468
-            isoCC => "DE",
469
-            subRegion => "",
470
-            region => "DE",
471
-            ipv4 => "True",
472
-            ipv6 => "False",
473
-            loadBalanced => "No",
474
-            httpWebsiteMirror => "http://www.torservers.net/mirrors/torproject.org/",
475
-            httpsWebsiteMirror => "https://www.torservers.net/mirrors/torproject.org/",
476
-            rsyncWebsiteMirror => "",
477
-            ftpWebsiteMirror => "",
478
-            httpDistMirror => "http://www.torservers.net/mirrors/torproject.org/dist/",
479
-            httpsDistMirror => "https://www.torservers.net/mirrors/torproject.org/dist/",
480
-            rsyncDistMirror => "",
481
-            hiddenServiceMirror => "http://hbpvnydyyjbmhx6b.onion/mirrors/torproject.org/",
482
-        },
483
-        mirror036 => {
484
-            adminContact => "",
485
-            orgName => "",
486
-            isoCC => "NL",
487
-            subRegion => "",
488
-            region => "NL",
489
-            ipv4 => "True",
490
-            ipv6 => "False",
491
-            loadBalanced => "No",
492
-            httpWebsiteMirror => "",
493
-            httpsWebsiteMirror => "",
494
-            rsyncWebsiteMirror => "",
495
-            ftpWebsiteMirror => "",
496
-            httpDistMirror => "",
497
-            httpsDistMirror => "https://www.coevoet.nl/tor/dist/",
498
-            rsyncDistMirror => "",
499
-            hiddenServiceMirror => "",
500
-      },
501
-        mirror038 => {
502
-            adminContact => "",
503
-            orgName => "",
504
-            isoCC => "LT",
505
-            subRegion => "",
506
-            region => "LT",
507
-            ipv4 => "True",
508
-            ipv6 => "False",
509
-            loadBalanced => "No",
510
-            httpWebsiteMirror => "http://tor.vesta.nu/",
511
-            httpsWebsiteMirror => "",
512
-            rsyncWebsiteMirror => "",
513
-            ftpWebsiteMirror => "",
514
-            httpDistMirror => "http://tor.vesta.nu/dist/",
515
-            httpsDistMirror => "",
516
-            rsyncDistMirror => "",
517
-            hiddenServiceMirror => "",
518
-      },
519
-        mirror045 => {
520
-            adminContact => "",
521
-            orgName => "",
522
-            isoCC => "TN",
523
-            subRegion => "",
524
-            region => "TN",
525
-            ipv4 => "True",
526
-            ipv6 => "False",
527
-            loadBalanced => "No",
528
-            httpWebsiteMirror => "http://tor.mirror.tn/",
529
-            httpsWebsiteMirror => "",
530
-            rsyncWebsiteMirror => "",
531
-            ftpWebsiteMirror => "",
532
-            httpDistMirror => "http://tor.mirror.tn/dist/",
533
-            httpsDistMirror => "",
534
-            rsyncDistMirror => "",
535
-            hiddenServiceMirror => "",
536
-      },
537
-        mirror045 => {
538
-            adminContact => "",
539
-            orgName => "",
540
-            isoCC => "TN",
541
-            subRegion => "",
542
-            region => "TN",
543
-            ipv4 => "True",
544
-            ipv6 => "False",
545
-            loadBalanced => "No",
546
-            httpWebsiteMirror => "http://torproject.antagonism.org/",
547
-            httpsWebsiteMirror => "https://torproject.antagonism.org/",
548
-            rsyncWebsiteMirror => "",
549
-            ftpWebsiteMirror => "",
550
-            httpDistMirror => "",
551
-            httpsDistMirror => "",
552
-            rsyncDistMirror => "",
553
-            hiddenServiceMirror => "",
554
-      },
555
-        mirror048 => {
556
-            adminContact => "",
557
-            orgName => "",
558
-            isoCC => "AT",
559
-            subRegion => "",
560
-            region => "AT",
561
-            ipv4 => "True",
562
-            ipv6 => "True",
563
-            loadBalanced => "No",
564
-            httpWebsiteMirror => "http://tor.dont-know-me.at/",
565
-            httpsWebsiteMirror => "",
566
-            rsyncWebsiteMirror => "",
567
-            ftpWebsiteMirror => "",
568
-            httpDistMirror => "http://tor.dont-know-me.at/dist/",
569
-            httpsDistMirror => "",
570
-            rsyncDistMirror => "",
571
-            hiddenServiceMirror => "",
572
-        },
573
-        mirror049 => {
574
-            adminContact => "IceBear",
575
-            orgName => "myRL.net",
576
-            isoCC => "IS",
577
-            subRegion => "",
578
-            region => "IS",
579
-            ipv4 => "True",
580
-            ipv6 => "False",
581
-            loadBalanced => "No",
582
-            httpWebsiteMirror => "http://tor.myrl.net/",
583
-            httpsWebsiteMirror => "https://tor.myrl.net/",
584
-            rsyncWebsiteMirror => "",
585
-            ftpWebsiteMirror => "",
586
-            httpDistMirror => "http://tor.myrl.net/dist/",
587
-            httpsDistMirror => "https://tor.myrl.net/dist/",
588
-            rsyncDistMirror => "",
589
-            hiddenServiceMirror => "",
590
-        },
591
-        mirror050 => {
592
-            adminContact => "",
593
-            orgName => "borgmann.tv",
594
-            isoCC => "DE",
595
-            subRegion => "",
596
-            region => "DE",
597
-            ipv4 => "True",
598
-            ipv6 => "False",
599
-            loadBalanced => "No",
600
-            httpWebsiteMirror => "http://tor.borgmann.tv/",
601
-            httpsWebsiteMirror => "",
602
-            rsyncWebsiteMirror => "",
603
-            ftpWebsiteMirror => "",
604
-            httpDistMirror => "http://tor.borgmann.tv/dist/",
605
-            httpsDistMirror => "",
606
-            rsyncDistMirror => "",
607
-            hiddenServiceMirror => "",
608
-        },
609
-        mirror051 => {
610
-            adminContact => "",
611
-            orgName => "torland",
612
-            isoCC => "GB",
613
-            subRegion => "",
614
-            region => "GB",
615
-            ipv4 => "True",
616
-            ipv6 => "False",
617
-            loadBalanced => "No",
618
-            httpWebsiteMirror => "http://mirror.torland.me/torproject.org/",
619
-            httpsWebsiteMirror => "https://mirror.torland.me/torproject.org/",
620
-            rsyncWebsiteMirror => "",
621
-            ftpWebsiteMirror => "",
622
-            httpDistMirror => "http://mirror.torland.me/torproject.org/dist/",
623
-            httpsDistMirror => "https://mirror.torland.me/torproject.org/dist/",
624
-            rsyncDistMirror => "",
625
-            hiddenServiceMirror => "",
626
-        },
627
-        mirror052 => {
628
-            adminContact => "",
629
-            orgName => "spline",
630
-            isoCC => "DE",
631
-            subRegion => "",
632
-            region => "DE",
633
-            ipv4 => "True",
634
-            ipv6 => "False",
635
-            loadBalanced => "No",
636
-            httpWebsiteMirror => "http://tor.spline.de/",
637
-            httpsWebsiteMirror => "https://tor.spline.inf.fu-berlin.de/",
638
-            rsyncWebsiteMirror => "rsync://ftp.spline.de/tor",
639
-            ftpWebsiteMirror => "ftp://ftp.spline.de/pub/tor",
640
-            httpDistMirror => "http://tor.spline.de/dist/",
641
-            httpsDistMirror => "https://tor.spline.inf.fu-berlin.de/dist/",
642
-            rsyncDistMirror => "rsync://ftp.spline.de/tor/dist",
643
-            hiddenServiceMirror => "",
644
-        },
645
-        mirror053 => {
646
-            adminContact => "",
647
-            orgName => "",
648
-            isoCC => "AT",
649
-            subRegion => "",
650
-            region => "AT",
651
-            ipv4 => "True",
652
-            ipv6 => "False",
653
-            loadBalanced => "No",
654
-            httpWebsiteMirror => "http://torproject.ph3x.at/",
655
-            httpsWebsiteMirror => "",
656
-            rsyncWebsiteMirror => "",
657
-            ftpWebsiteMirror => "",
658
-            httpDistMirror => "http://torproject.ph3x.at/dist/",
659
-            httpsDistMirror => "",
660
-            rsyncDistMirror => "",
661
-            hiddenServiceMirror => "",
662
-        },
663
-        mirror054 => {
664
-            adminContact => "",
665
-            orgName => "hessmo",
666
-            isoCC => "US",
667
-            subRegion => "",
668
-            region => "US",
669
-            ipv4 => "True",
670
-            ipv6 => "False",
671
-            loadBalanced => "No",
672
-            httpWebsiteMirror => "http://mirror.hessmo.com/tor/",
673
-            httpsWebsiteMirror => "",
674
-            rsyncWebsiteMirror => "",
675
-            ftpWebsiteMirror => "",
676
-            httpDistMirror => "http://mirror.hessmo.com/tor/dist/",
677
-            httpsDistMirror => "",
678
-            rsyncDistMirror => "",
679
-            hiddenServiceMirror => "",
680
-        },
681
-        mirror058 => {
682
-            adminContact => "",
683
-            orgName => "",
684
-            isoCC => "US",
685
-            subRegion => "",
686
-            region => "US",
687
-            ipv4 => "True",
688
-            ipv6 => "True",
689
-            loadBalanced => "No",
690
-            httpWebsiteMirror => "http://tor.loritsu.com/",
691
-            httpsWebsiteMirror => "",
692
-            rsyncWebsiteMirror => "",
693
-            ftpWebsiteMirror => "",
694
-            httpDistMirror => "http://tor.loritsu.com/dist/",
695
-            httpsDistMirror => "",
696
-            rsyncDistMirror => "",
697
-            hiddenServiceMirror => "",
698
-        },
699
-        mirror060 => {
700
-            adminContact => "",
701
-            orgName => "",
702
-            isoCC => "DE",
703
-            subRegion => "",
704
-            region => "DE",
705
-            ipv4 => "True",
706
-            ipv6 => "False",
707
-            loadBalanced => "No",
708
-            httpWebsiteMirror => "http://torproject.cryptowars.info/",
709
-            httpsWebsiteMirror => "https://torproject.cryptowars.info/",
710
-            rsyncWebsiteMirror => "rsync://torproject.cryptowars.info/",
711
-            ftpWebsiteMirror => "",
712
-            httpDistMirror => "http://torproject.cryptowars.info/dist/",
713
-            httpsDistMirror => "https://torproject.cryptowars.info/dist/",
714
-            rsyncDistMirror => "",
715
-            hiddenServiceMirror => "",
716
-        },
717
-        mirror062 => {
718
-            adminContact => "",
719
-            orgName => "",
720
-            isoCC => "DE",
721
-            subRegion => "",
722
-            region => "DE",
723
-            ipv4 => "True",
724
-            ipv6 => "False",
725
-            loadBalanced => "No",
726
-            httpWebsiteMirror => "http://tor.dev-random.de/",
727
-            httpsWebsiteMirror => "https://tor.dev-random.de/",
728
-            rsyncWebsiteMirror => "",
729
-            ftpWebsiteMirror => "",
730
-            httpDistMirror => "http://tor.dev-random.de/dist/",
731
-            httpsDistMirror => "https://tor.dev-random.de/dist/",
732
-            rsyncDistMirror => "",
733
-            hiddenServiceMirror => "",
734
-    },
735
-        mirror063 => {
736
-            adminContact => "",
737
-            orgName => "crazyhaze.de",
738
-            isoCC => "DE",
739
-            subRegion => "",
740
-            region => "DE",
741
-            ipv4 => "True",
742
-            ipv6 => "False",
743
-            loadBalanced => "No",
744
-            httpWebsiteMirror => "http://tor.crazyhaze.de/",
745
-            httpsWebsiteMirror => "https://tor.crazyhaze.de/",
746
-            rsyncWebsiteMirror => "",
747
-            ftpWebsiteMirror => "",
748
-            httpDistMirror => "http://tor.crazyhaze.de/dist/",
749
-            httpsDistMirror => "https://tor.crazyhaze.de/dist/",
750
-            rsyncDistMirror => "",
751
-            hiddenServiceMirror => "",
752
-    },
753
-        mirror066 => {
754
-            adminContact => "",
755
-            orgName => "Lightning-bolt.net",
756
-            isoCC => "CZ",
757
-            subRegion => "",
758
-            region => "CZ",
759
-            ipv4 => "True",
760
-            ipv6 => "False",
761
-            loadBalanced => "No",
762
-            httpWebsiteMirror => "http://torproject.lightning-bolt.net/",
763
-            httpsWebsiteMirror => "",
764
-            rsyncWebsiteMirror => "",
765