update-mirrors.pl
532901be
 #!/usr/bin/perl -w
 use warnings;
 use strict;
 use LWP::Simple;
 use LWP;
 use Date::Parse;
759dd463
 use Date::Format;
532901be
 
238e706b
 #
 # A quick hack by Jacob Appelbaum <jacob@appelbaum.net>
940ab031
 # LWP suggestions by Leigh Honeywell
238e706b
 # This is Free Software (GPLv3)
 # http://www.gnu.org/licenses/gpl-3.0.txt
 #
838938ca
 # CHANGELOG
 # 20091003 Code changes to elimiate the need for a trailing slash in addresses for script runtime
 # 20091004 Code changes to increase out of date tolerance to 48 hours
 # 20091028 Code changes to increase timout to 30 seconds (attempting to # resolve "unknown" status')
 # 20091028 Code changes to change user agent of script
 # 20100807 Remove dead mirrors.
238e706b
 
532901be
 print "Creating LWP agent ($LWP::VERSION)...\n";
 my $lua = LWP::UserAgent->new(
     keep_alive => 1,
55e27233
     timeout => 30,
69c4ddc9
     agent => "Tor MirrorCheck Agent"
532901be
 );
 
 sub sanitize {
     my $taintedData = shift;
     my $cleanedData;
     my $whitelist = '-a-zA-Z0-9: +';
 
     # clean the data, return cleaned data
     $taintedData =~ s/[^$whitelist]//go;
     $cleanedData = $taintedData;
 
     return $cleanedData;
 }
 
 sub FetchDate {
     my $url = shift; # Base url for mirror
3b0a6878
     my $trace = "project/trace/www-master.torproject.org"; # this file should always exist
3c4201b3
     $url = "$url/$trace";
532901be
 
     print "Fetching possible date from: $url\n";
 
     my $request = new HTTP::Request GET => "$url";
     my $result = $lua->request($request);
a86b52c5
     my $code = $result->code();
     print "Result code $code\n";
532901be
 
a86b52c5
     if ($result->is_success && $code eq "200"){
532901be
        my $taint = $result->content;
        my $content = sanitize($taint);
        if ($content) {
940ab031
 
532901be
             my $date = str2time($content);
 
             if ($date) {
                 print "We've fetched a date $date.\n";
                 return $date;
             } else {
                 print "We've haven't fetched a date.\n";
                 return "Unknown";
             }
 
         } else {
             print "Unable to fetch date, empty content returned.\n";
             return "Unknown";
         }
940ab031
 
532901be
     } else {
        print "Our request failed, we had no result.\n";
        return "Unknown";
     }
a86b52c5
 
     return "Unknown";
532901be
 }
 
 # This is the list of all known Tor mirrors
 # Add new mirrors to the bottom!
fafbb604
 my %m = (
 
f80d2636
 
76ebe69b
         mirror000 => {
             adminContact => "coralcdn.org",
             orgName => "CoralCDN",
             isoCC => "INT",
             subRegion => "",
             region => "INT",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "Yes",
             httpWebsiteMirror => "http://www.torproject.org.nyud.net/",
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
             httpDistMirror => "http://www.torproject.org.nyud.net/dist/",
             httpsDistMirror => "",
             rsyncDistMirror => "",
2b9f77ca
             hiddenServiceMirror => ""
76ebe69b
         },
 
fe0b5ab8
         mirror001 => {
             adminContact => "BarkerJr AT barkerjr DOT net",
             orgName => "BarkerJr",
             isoCC => "FR",
             subRegion => "",
             region => "FR",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
a0226d94
             httpWebsiteMirror => "http://www.oignon.net/",
4a46cda9
             httpsWebsiteMirror => "https://www.oignon.net/",
fe0b5ab8
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
72c3928b
             httpDistMirror => "http://www.oignon.net/dist/",
4a46cda9
             httpsDistMirror => "https://www.oignon.net/dist/",
fe0b5ab8
             rsyncDistMirror => "",
2b9f77ca
             hiddenServiceMirror => ""
fe0b5ab8
         },
 
838938ca
        mirror003 => {
ab4b6992
             adminContact => "citizen428 AT gmail DOT com",
79e6ad8b
             orgName => "[[:bbs:]]",
532901be
             isoCC => "DE",
             subRegion => "",
             region => "Europe",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "Unknown",
             httpWebsiteMirror => "http://tor.blingblingsquad.net/",
e44f4a70
             httpsWebsiteMirror => "https://tor.blingblingsquad.net/",
532901be
             ftpWebsiteMirror => "",
             rsyncWebsiteMirror => "",
154245d8
             httpDistMirror => "http://tor.blingblingsquad.net/dist/",
             httpsDistMirror => "https://tor.blingblingsquad.net/dist/",
2b9f77ca
             rsyncDistMirror => ""
532901be
         },
 
838938ca
 	    mirror006 => {
44a792e5
             adminContact => "BarkerJr AT barkerjr DOT net",
             orgName => "BarkerJr",
             isoCC => "US",
             subRegion => "",
             region => "US",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
e2724479
             httpWebsiteMirror => "http://www.torproject.us/",
             httpsWebsiteMirror => "https://www.torproject.us/",
567072db
             rsyncWebsiteMirror => "rsync://rsync.torproject.us/tor",
44a792e5
             ftpWebsiteMirror => "",
e2724479
             httpDistMirror => "http://www.torproject.us/dist/",
             httpsDistMirror => "https://www.torproject.us/dist/",
567072db
             rsyncDistMirror => "rsync://rsync.torproject.us/tor/dist",
2b9f77ca
             hiddenServiceMirror => ""
44a792e5
         },
 
838938ca
        mirror007 => {
ab4b6992
             adminContact => "info AT zentrum-der-gesundheit DOT de",
d6db243b
             orgName => "Zentrum der Gesundheit",
532901be
             isoCC => "DK",
             subRegion => "",
             region => "Europe",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "Unknown",
ef0bc85c
             httpWebsiteMirror => "http://tor.idnr.ws/",
532901be
             ftpWebsiteMirror => "",
940ab031
             rsyncWebsiteMirror => "",
ef0bc85c
             httpDistMirror => "http://tor.idnr.ws/dist/",
2b9f77ca
             rsyncDistMirror => ""
532901be
         },
 
838938ca
        mirror008 => {
ab4b6992
             adminContact => "root AT amorphis DOT eu",
d6db243b
             orgName => "Amorphis",
532901be
             isoCC => "NL",
             subRegion => "",
             region => "Europe",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "Unknown",
             httpWebsiteMirror => "http://tor.amorphis.eu/",
940ab031
             rsyncWebsiteMirror => "",
532901be
             ftpWebsiteMirror => "",
             httpDistMirror => "http://tor.amorphis.eu/dist/",
2b9f77ca
             rsyncDistMirror => ""
532901be
         },
838938ca
        mirror010 => {
ab4b6992
             adminContact => "webmaster AT ccc DOT de",
532901be
             orgName => "CCC",
             isoCC => "NL",
             subRegion => "",
             region => "Europe",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "Unknown",
             httpWebsiteMirror => "http://tor.ccc.de/",
940ab031
             rsyncWebsiteMirror => "",
532901be
             ftpWebsiteMirror => "",
             httpDistMirror => "http://tor.ccc.de/dist/",
2b9f77ca
             rsyncDistMirror => ""
532901be
         },
 
838938ca
        mirror013 => {
ab4b6992
 	    adminContact => "hostmaster AT zombiewerks DOT com",
cfa2b38c
             orgName => "TheOnionRouter",
10839949
             isoCC => "IS",
             subRegion => "",
             region => "Iceland",
532901be
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "Unknown",
a57cbe31
             httpWebsiteMirror => "http://theonionrouter.com/",
             httpsWebsiteMirror => "",
940ab031
             rsyncWebsiteMirror => "",
532901be
             ftpWebsiteMirror => "",
a57cbe31
             httpDistMirror => "http://theonionrouter.com/dist/",
             httpsDistMirror => "",
2b9f77ca
             rsyncDistMirror => ""
532901be
         },
a57cbe31
     mirror014 => {
         adminContact => "tormaster AT xpdm DOT us",
         orgName => "Xpdm",
         isoCC => "US",
         subRegion => "",
         region => "North America",
         ipv4 => "True",
         ipv6 => "False",
         loadBalanced => "Unknown",
         httpWebsiteMirror => "http://torproj.xpdm.us/",
         httpsWebsiteMirror => "https://torproj.xpdm.us/",
         rsyncWebsiteMirror => "",
         ftpWebsiteMirror => "",
         httpDistMirror => "http://torproj.xpdm.us/dist/",
         httpsDistMirror => "https://torproj.xpdm.us/dist/",
         rsyncDistMirror => "",
2b9f77ca
         hiddenServiceMirror => "http://h3prhz46uktgm4tt.onion/"
a57cbe31
         },
2b9f77ca
      mirror016 => {
ab4b6992
             adminContact => "security AT hostoffice DOT hu",
87080eec
             orgName => "Unknown",
             isoCC => "HU",
             subRegion => "Hungary",
             region => "Europe",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
f45ba876
             httpWebsiteMirror => "http://mirror.tor.hu/",
87080eec
             httpsWebsiteMirror => "",
940ab031
             rsyncWebsiteMirror => "",
87080eec
             ftpWebsiteMirror => "",
3b0a6878
             httpDistMirror => "http://mirror.tor.hu/dist/",
87080eec
             httpsDistMirror => "",
             rsyncDistMirror => "",
2b9f77ca
             hiddenServiceMirror => ""
940ab031
         },
2b9f77ca
    mirror018 => {
940ab031
             adminContact => "",
             orgName => "chaos darmstadt",
             isoCC => "DE",
             subRegion => "Germany",
             region => "Europe",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://mirrors.chaos-darmstadt.de/tor-mirror/",
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
             httpDistMirror => "http://mirrors.chaos-darmstadt.de/tor-mirror/dist/",
             httpsDistMirror => "",
             rsyncDistMirror => "",
2b9f77ca
             hiddenServiceMirror => ""
c7112e94
         },
6f73b9b1
 
838938ca
 	mirror019 => {
da69ab61
             adminContact => "webmaster AT askapache DOT com",
             orgName => "AskApache",
c7112e94
             isoCC => "US",
             subRegion => "California",
             region => "US",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://tor.askapache.com/",
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
da69ab61
             httpDistMirror => "http://tor.askapache.com/dist/",
c7112e94
             httpsDistMirror => "",
             rsyncDistMirror => "",
2b9f77ca
             hiddenServiceMirror => ""
c819dd8d
         },
6f73b9b1
 
838938ca
 	mirror020 => {
ddfe7fb7
             adminContact => " mail AT benjamin-meier DOT info ",
             orgName => "beme it",
6355d769
             isoCC => "DE",
54ef3364
             subRegion => "",
ddfe7fb7
             region => "DE",
54ef3364
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
ddfe7fb7
             httpWebsiteMirror => "http://tor.beme-it.de/",
2412008c
             httpsWebsiteMirror => "https://tor.beme-it.de/",
6355d769
             rsyncWebsiteMirror => "rsync://tor.beme-it.de/tor",
54ef3364
             ftpWebsiteMirror => "",
ddfe7fb7
             httpDistMirror => "http://tor.beme-it.de/dist/",
2412008c
             httpsDistMirror => "https://tor.beme-it.de/dist/",
6355d769
             rsyncDistMirror => "rsync://tor.beme-it.de/tor/dist",
2b9f77ca
             hiddenServiceMirror => ""
c819dd8d
         },
6f73b9b1
 
838938ca
         mirror021 => {
56e53786
             adminContact => "",
65d4c20f
             orgName => "India Tor Fans",
56e53786
             isoCC => "IN",
             subRegion => "",
             region => "IN",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
df83e179
             httpWebsiteMirror => "http://www.torproject.org.in/",
56e53786
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
             httpDistMirror => "http://www.torproject.org.in/dist/",
             httpsDistMirror => "",
             rsyncDistMirror => "",
2b9f77ca
             hiddenServiceMirror => ""
56e53786
         },
 
838938ca
         mirror024 => {
bf3c67eb
             adminContact => "",
65d4c20f
             orgName => "homosu",
b55e8536
             isoCC => "SE",
bf3c67eb
             subRegion => "",
b55e8536
             region => "SE",
bf3c67eb
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://tor.homosu.net/",
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
3b0a6878
             httpDistMirror => "http://tor.homosu.net/dist/",
bf3c67eb
             httpsDistMirror => "",
             rsyncDistMirror => "",
2b9f77ca
             hiddenServiceMirror => ""
86771c7f
         },
e2a7cfa7
 
838938ca
         mirror025 => {
e2a7cfa7
             adminContact => "margus.random at mail.ee",
             orgName => "CyberSIDE",
65fa2bbd
             isoCC => "EE",
e2a7cfa7
             subRegion => "",
             region => "EE",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://cyberside.planet.ee/tor/",
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
dcf4e3fd
             httpDistMirror => "http://cyberside.net.ee/tor/",
e2a7cfa7
             httpsDistMirror => "",
             rsyncDistMirror => "",
2b9f77ca
             hiddenServiceMirror => ""
9133d82f
         },
962a1385
 
08265341
         mirror028 => {
b5630580
             adminContact => "",
c95b68b3
             orgName => "NW Linux",
b5630580
             isoCC => "US",
             subRegion => "WA",
             region => "US",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
3b0a6878
             httpWebsiteMirror => "http://torproject.nwlinux.us/",
b5630580
             httpsWebsiteMirror => "",
99e7e300
             rsyncWebsiteMirror => "rsync://nwlinux.us/tor-web",
b5630580
             ftpWebsiteMirror => "",
3b0a6878
             httpDistMirror => "http://torproject.nwlinux.us/dist/",
b5630580
             httpsDistMirror => "",
99e7e300
             rsyncDistMirror => "rsync://nwlinux.us/tor-dist",
1042f856
             hiddenServiceMirror => "",
         },
8276ea18
         mirror029 => {
1042f856
             adminContact => "",
             orgName => "LazyTiger",
             isoCC => "FR",
             subRegion => "",
             region => "FR",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://tor.taiga-san.net/",
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
3b0a6878
             httpDistMirror => "http://tor.taiga-san.net/dist/",
1042f856
             httpsDistMirror => "",
             rsyncDistMirror => "",
b4cd62c2
             hiddenServiceMirror => "",
         },
8276ea18
         mirror030 => {
b4cd62c2
             adminContact => "",
             orgName => "searchprivate",
             isoCC => "US",
             subRegion => "TX",
             region => "US",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
3b0a6878
             httpWebsiteMirror => "http://tor.searchprivate.com/",
b4cd62c2
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
3b0a6878
             httpDistMirror => "http://tor.searchprivate.com/dist/",
b4cd62c2
             httpsDistMirror => "",
             rsyncDistMirror => "",
5afd7fcd
             hiddenServiceMirror => "",
         },
8276ea18
         mirror031 => {
5afd7fcd
             adminContact => "",
             orgName => "cyberarmy",
             isoCC => "AT",
             subRegion => "",
             region => "AT",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
3b0a6878
             httpWebsiteMirror => "http://tor.cyberarmy.at/",
5afd7fcd
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
0d07397a
             httpDistMirror => "",
5afd7fcd
             httpsDistMirror => "",
             rsyncDistMirror => "",
             hiddenServiceMirror => "",
         },
         mirror032 => {
             adminContact => "",
c26f8224
             orgName => "torproject.is",
5afd7fcd
             isoCC => "IS",
             subRegion => "",
             region => "IS",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
c26f8224
             httpWebsiteMirror => "http://torproject.is/",
5afd7fcd
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
3b0a6878
             httpDistMirror => "http://torproject.is/dist/",
5afd7fcd
             httpsDistMirror => "",
             rsyncDistMirror => "",
9133d82f
             hiddenServiceMirror => "",
78a6df20
         },
         mirror033 => {
             adminContact => "",
             orgName => "torservers",
             isoCC => "DE",
             subRegion => "",
             region => "DE",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://www.torservers.net/mirrors/torproject.org/",
             httpsWebsiteMirror => "https://www.torservers.net/mirrors/torproject.org/",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
3b0a6878
             httpDistMirror => "http://www.torservers.net/mirrors/torproject.org/dist/",
             httpsDistMirror => "https://www.torservers.net/mirrors/torproject.org/dist/",
78a6df20
             rsyncDistMirror => "",
             hiddenServiceMirror => "http://hbpvnydyyjbmhx6b.onion/mirrors/torproject.org/",
f7418f8c
         },
57ca6a7c
         mirror036 => {
             adminContact => "",
             orgName => "",
             isoCC => "NL",
             subRegion => "",
             region => "NL",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "",
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
             httpDistMirror => "",
3b0a6878
             httpsDistMirror => "https://www.coevoet.nl/tor/dist/",
57ca6a7c
             rsyncDistMirror => "",
             hiddenServiceMirror => "",
35949ea1
       },
         mirror038 => {
             adminContact => "",
             orgName => "",
             isoCC => "LT",
             subRegion => "",
             region => "LT",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
3b0a6878
             httpWebsiteMirror => "http://tor.vesta.nu/",
35949ea1
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
3b0a6878
             httpDistMirror => "http://tor.vesta.nu/dist/",
da77fe78
             httpsDistMirror => "",
             rsyncDistMirror => "",
d7f8d17a
             hiddenServiceMirror => "",
f56169bb
       },
         mirror045 => {
             adminContact => "",
             orgName => "",
             isoCC => "TN",
             subRegion => "",
             region => "TN",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://tor.mirror.tn/",
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
             httpDistMirror => "http://tor.mirror.tn/dist/",
             httpsDistMirror => "",
             rsyncDistMirror => "",
da77fe78
             hiddenServiceMirror => "",
df990e60
       },
b8618cd9
         mirror045 => {
df990e60
             adminContact => "",
             orgName => "",
b8618cd9
             isoCC => "TN",
df990e60
             subRegion => "",
b8618cd9
             region => "TN",
df990e60
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
66b90f5b
             httpWebsiteMirror => "http://torproject.antagonism.org/",
b8618cd9
             httpsWebsiteMirror => "https://torproject.antagonism.org/",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
61b18501
             httpDistMirror => "",
             httpsDistMirror => "",
b8618cd9
             rsyncDistMirror => "",
b8de9898
             hiddenServiceMirror => "",
7454d51d
       },
         mirror048 => {
             adminContact => "",
             orgName => "",
             isoCC => "AT",
             subRegion => "",
             region => "AT",
             ipv4 => "True",
             ipv6 => "True",
             loadBalanced => "No",
             httpWebsiteMirror => "http://tor.dont-know-me.at/",
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
             httpDistMirror => "http://tor.dont-know-me.at/dist/",
             httpsDistMirror => "",
             rsyncDistMirror => "",
6f37444e
             hiddenServiceMirror => "",
         },
         mirror049 => {
             adminContact => "IceBear",
43b72c60
             orgName => "myRL.net",
6f37444e
             isoCC => "IS",
             subRegion => "",
             region => "IS",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://tor.myrl.net/",
             httpsWebsiteMirror => "https://tor.myrl.net/",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
             httpDistMirror => "http://tor.myrl.net/dist/",
             httpsDistMirror => "https://tor.myrl.net/dist/",
             rsyncDistMirror => "",
8a0e3858
             hiddenServiceMirror => "",
         },
         mirror050 => {
             adminContact => "",
ecb76586
             orgName => "borgmann.tv",
8a0e3858
             isoCC => "DE",
             subRegion => "",
             region => "DE",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://tor.borgmann.tv/",
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
             httpDistMirror => "http://tor.borgmann.tv/dist/",
             httpsDistMirror => "",
             rsyncDistMirror => "",
2242997b
             hiddenServiceMirror => "",
30b13f29
         },
         mirror051 => {
             adminContact => "",
             orgName => "torland",
acbd4748
             isoCC => "GB",
30b13f29
             subRegion => "",
acbd4748
             region => "GB",
30b13f29
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
d933529b
             httpWebsiteMirror => "http://mirror.torland.me/torproject.org/",
             httpsWebsiteMirror => "https://mirror.torland.me/torproject.org/",
30b13f29
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
d933529b
             httpDistMirror => "http://mirror.torland.me/torproject.org/dist/",
             httpsDistMirror => "https://mirror.torland.me/torproject.org/dist/",
30b13f29
             rsyncDistMirror => "",
             hiddenServiceMirror => "",
         },
         mirror052 => {
             adminContact => "",
             orgName => "spline",
             isoCC => "DE",
             subRegion => "",
             region => "DE",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://tor.spline.de/",
a081ea3e
             httpsWebsiteMirror => "https://tor.spline.inf.fu-berlin.de/",
30b13f29
             rsyncWebsiteMirror => "rsync://ftp.spline.de/tor",
             ftpWebsiteMirror => "ftp://ftp.spline.de/pub/tor",
             httpDistMirror => "http://tor.spline.de/dist/",
a081ea3e
             httpsDistMirror => "https://tor.spline.inf.fu-berlin.de/dist/",
30b13f29
             rsyncDistMirror => "rsync://ftp.spline.de/tor/dist",
             hiddenServiceMirror => "",
9620cfee
         },
         mirror053 => {
             adminContact => "",
             orgName => "",
             isoCC => "AT",
             subRegion => "",
             region => "AT",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://torproject.ph3x.at/",
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
             httpDistMirror => "http://torproject.ph3x.at/dist/",
             httpsDistMirror => "",
             rsyncDistMirror => "",
e5d33ddf
             hiddenServiceMirror => "",
         },
         mirror054 => {
             adminContact => "",
8aea804d
             orgName => "hessmo",
e5d33ddf
             isoCC => "US",
             subRegion => "",
             region => "US",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://mirror.hessmo.com/tor/",
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
8aea804d
             httpDistMirror => "http://mirror.hessmo.com/tor/dist/",
e5d33ddf
             httpsDistMirror => "",
             rsyncDistMirror => "",
4471d2f9
             hiddenServiceMirror => "",
         },
b9fdc5f6
         mirror058 => {
             adminContact => "",
             orgName => "",
             isoCC => "US",
             subRegion => "",
             region => "US",
             ipv4 => "True",
             ipv6 => "True",
             loadBalanced => "No",
             httpWebsiteMirror => "http://tor.loritsu.com/",
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
             httpDistMirror => "http://tor.loritsu.com/dist/",
             httpsDistMirror => "",
             rsyncDistMirror => "",
             hiddenServiceMirror => "",
         },
b15d962f
         mirror060 => {
             adminContact => "",
             orgName => "",
             isoCC => "DE",
             subRegion => "",
             region => "DE",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://torproject.cryptowars.info/",
             httpsWebsiteMirror => "https://torproject.cryptowars.info/",
             rsyncWebsiteMirror => "rsync://torproject.cryptowars.info/",
             ftpWebsiteMirror => "",
             httpDistMirror => "http://torproject.cryptowars.info/dist/",
             httpsDistMirror => "https://torproject.cryptowars.info/dist/",
             rsyncDistMirror => "",
9620cfee
             hiddenServiceMirror => "",
d5de62bb
         },
42b0cad9
         mirror062 => {
             adminContact => "",
             orgName => "",
             isoCC => "DE",
             subRegion => "",
             region => "DE",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://tor.dev-random.de/",
             httpsWebsiteMirror => "https://tor.dev-random.de/",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
             httpDistMirror => "http://tor.dev-random.de/dist/",
             httpsDistMirror => "https://tor.dev-random.de/dist/",
             rsyncDistMirror => "",
             hiddenServiceMirror => "",
     },
         mirror063 => {
             adminContact => "",
d0791268
             orgName => "crazyhaze.de",
42b0cad9
             isoCC => "DE",
             subRegion => "",
             region => "DE",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://tor.crazyhaze.de/",
             httpsWebsiteMirror => "https://tor.crazyhaze.de/",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
d0791268
             httpDistMirror => "http://tor.crazyhaze.de/dist/",
             httpsDistMirror => "https://tor.crazyhaze.de/dist/",
42b0cad9
             rsyncDistMirror => "",
             hiddenServiceMirror => "",
a8e434d9
     },
         mirror066 => {
             adminContact => "",
0f9a54b5
             orgName => "Lightning-bolt.net",
             isoCC => "CZ",
a8e434d9
             subRegion => "",
0f9a54b5
             region => "CZ",
a8e434d9
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://torproject.lightning-bolt.net/",
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
             httpDistMirror => "http://torproject.lightning-bolt.net/dist/",
             httpsDistMirror => "",
             rsyncDistMirror => "",
d5de62bb
             hiddenServiceMirror => "",
e9b93148
     },
         mirror067 => {
             adminContact => "",
             orgName => "",
             isoCC => "US",
             subRegion => "",
             region => "US",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
ad72b7e4
             httpWebsiteMirror => "http://tor.mirrors.whitedholdings.org/",
             httpsWebsiteMirror => "https://tor.mirrors.whitedholdings.org/",
             rsyncWebsiteMirror => "rsync://mirrors.whitedholdings.org/tor",
e9b93148
             ftpWebsiteMirror => "",
ad72b7e4
             httpDistMirror => "http://tor.mirrors.whitedholdings.org/dist/",
             httpsDistMirror => "https://tor.mirrors.whitedholdings.org/dist/",
             rsyncDistMirror => "rsync://tor.mirrors.whitedholdings.org/tor-dist",
e9b93148
             hiddenServiceMirror => "",
adf355a4
      },
         mirror069 => {
             adminContact => "",
             orgName => "",
             isoCC => "FR",
             subRegion => "",
             region => "FR",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://tor.mirror.chekanov.net/",
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
             httpDistMirror => "http://tor.mirror.chekanov.net/dist/",
             httpsDistMirror => "",
             rsyncDistMirror => "",
78b3274c
             hiddenServiceMirror => "",
b11a3951
     },
         mirror072 => {
             adminContact => "",
             orgName => "",
             isoCC => "US",
             subRegion => "",
             region => "US",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://tor.minibofh.org/",
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
             httpDistMirror => "http://tor.minibofh.org/dist/",
             httpsDistMirror => "",
             rsyncDistMirror => "",
             hiddenServiceMirror => "",
     },
         mirror073 => {
             adminContact => "",
             orgName => "",
             isoCC => "UA",
             subRegion => "",
             region => "UA",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://torua.reactor-xg.kiev.ua/",
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
             httpDistMirror => "http://torua.reactor-xg.kiev.ua/dist/",
             httpsDistMirror => "",
             rsyncDistMirror => "",
a7e8b72f
             hiddenServiceMirror => "",
126f0de6
     },
         mirror075 => {
             adminContact => "",
003b9f5e
             orgName => "me0w.cc",
             isoCC => "RO",
126f0de6
             subRegion => "",
003b9f5e
             region => "RO",
126f0de6
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://tor.me0w.cc/",
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
             httpDistMirror => "http://tor.me0w.cc/dist/",
             httpsDistMirror => "",
             rsyncDistMirror => "",
8b75292a
             hiddenServiceMirror => "",
     },
         mirror076 => {
             adminContact => "",
             orgName => "",
             isoCC => "US",
             subRegion => "",
             region => "US",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://mirror.nametoday.me/tor/",
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
             httpDistMirror => "http://mirror.nametoday.me/tor/dist/",
             httpsDistMirror => "",
             rsyncDistMirror => "",
fb696fce
             hiddenServiceMirror => "",
f80d2636
         },
         mirror077 => {
             adminContact => "",
             orgName => "",
             isoCC => "UK",
             subRegion => "",
             region => "UK",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://tor.mage.me.uk/",
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
             httpDistMirror => "http://tor.mage.me.uk/dist/",
             httpsDistMirror => "",
             rsyncDistMirror => "",
a15e7e77
             hiddenServiceMirror => "",
     },
         mirror078 => {
             adminContact => "",
             orgName => "",
             isoCC => "CH",
             subRegion => "",
             region => "CH",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://torproject.pillo-srv.ch/",
             httpsWebsiteMirror => "https://torproject.pillo-srv.ch/",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
             httpDistMirror => "http://torproject.pillo-srv.ch/dist/",
             httpsDistMirror => "https://torproject.pillo-srv.ch/dist/",
             rsyncDistMirror => "",
a854b94c
             hiddenServiceMirror => "",
     },
         mirror079 => {
             adminContact => "",
             orgName => "",
             isoCC => "LU",
             subRegion => "",
             region => "LU",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://torproject.adamas.ai/",
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
             httpDistMirror => "http://torproject.adamas.ai/dist/",
             httpsDistMirror => "",
             rsyncDistMirror => "",
             hiddenServiceMirror => "",
     },
         mirror080 => {
             adminContact => "",
             orgName => "",
             isoCC => "FR",
             subRegion => "",
             region => "FR",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://torproject.c3l.lu/",
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
             httpDistMirror => "http://torproject.c3l.lu/dist/",
             httpsDistMirror => "",
             rsyncDistMirror => "",
e5425867
             hiddenServiceMirror => "",
     },
         mirror081 => {
             adminContact => "",
             orgName => "",
             isoCC => "EE",
             subRegion => "",
             region => "EE",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://tor.li/",
371cfe23
             httpsWebsiteMirror => "https://tor.li/",
e5425867
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
371cfe23
             httpDistMirror => "http://tor.li/dist/",
             httpsDistMirror => "https://tor.li/dist/",
e5425867
             rsyncDistMirror => "",
25599874
             hiddenServiceMirror => "",
     },
         mirror082 => {
             adminContact => "",
             orgName => "",
             isoCC => "US",
             subRegion => "",
             region => "US",
             ipv4 => "True",
             ipv6 => "True",
             loadBalanced => "No",
             httpWebsiteMirror => "http://mirror.nametoday.me/tor/",
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
             httpDistMirror => "http://mirror.nametoday.me/tor/dist/",
             httpsDistMirror => "",
             rsyncDistMirror => "",
4f2b8ced
             hiddenServiceMirror => "",
230ecae9
     },
         mirror085 => {
             adminContact => "",
89e5899d
             orgName => "Soviet Anonymous",
230ecae9
             isoCC => "RU",
             subRegion => "",
             region => "RU",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
2a028bd3
             httpWebsiteMirror => "http://creep.im/tor",
230ecae9
             httpsWebsiteMirror => "https://creep.im/tor",
d86e2a5b
             rsyncWebsiteMirror => "rsync://creep.im/tor",
             ftpWebsiteMirror => "ftp://creep.im/mirrors/tor",
2a028bd3
             httpDistMirror => "http://creep.im/tor/dist/",
89e5899d
             httpsDistMirror => "https://creep.im/tor/dist/",
d86e2a5b
             rsyncDistMirror => "rsync://creep.im/tor-dist",
acccf15f
             hiddenServiceMirror => "",
     },
         mirror086 => {
             adminContact => "",
             orgName => "",
             isoCC => "US",
             subRegion => "",
             region => "US",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://199.175.55.215/",
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
             httpDistMirror => "http://199.175.55.215/dist/",
             httpsDistMirror => "",
             rsyncDistMirror => "",
3e7ff90e
             hiddenServiceMirror => "",
     },
         mirror087 => {
             adminContact => "",
             orgName => "",
             isoCC => "DE",
             subRegion => "",
             region => "DE",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://tor.linuxlounge.net/",
             httpsWebsiteMirror => "https://tor.linuxlounge.net/",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
             httpDistMirror => "http://tor.linuxlounge.net/dist/",
             httpsDistMirror => "https://tor.linuxlounge.net/dist/",
             rsyncDistMirror => "",
230ecae9
             hiddenServiceMirror => "",
fc07451c
     },
         mirror088 => {
             adminContact => "",
             orgName => "",
             isoCC => "US",
             subRegion => "",
             region => "US",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "",
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
2b9f77ca
             ftpWebsiteMirror => "",
fc07451c
             httpDistMirror => "http://mirrors.go-part.com/tor/dist/",
             httpsDistMirror => "",
             rsyncDistMirror => "rsync://mirrors.go-part.com/tor/dist/",
             hiddenServiceMirror => "",
aa56d98c
     },
         mirror089 => {
             adminContact => "",
             orgName => "",
             isoCC => "US",
             subRegion => "",
             region => "US",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "",
             httpsWebsiteMirror => "",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
             httpDistMirror => "http://www.netgull.com/torproject/",
             httpsDistMirror => "",
             rsyncDistMirror => "",
f5b2c927
             hiddenServiceMirror => "",
     },
         mirror090 => {
             adminContact => "",
             orgName => "",
             isoCC => "US",
             subRegion => "",
             region => "US",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://torproject.guilhem.org/",
             httpsWebsiteMirror => "https://torproject.guilhem.org/",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
             httpDistMirror => "http://torproject.guilhem.org/dist/",
             httpsDistMirror => "https://torproject.guilhem.org/dist/",
             rsyncDistMirror => "",
15684959
             hiddenServiceMirror => "",
     },
         mirror091 => {
             adminContact => "",
             orgName => "",
             isoCC => "MX",
             subRegion => "",
             region => "MX",
             ipv4 => "True",
             ipv6 => "False",
             loadBalanced => "No",
             httpWebsiteMirror => "http://fbnaia.homelinux.net/torproject/",
             httpsWebsiteMirror => "https://fbnaia.homelinux.net/torproject/",
             rsyncWebsiteMirror => "",
             ftpWebsiteMirror => "",
             httpDistMirror => "http://fbnaia.homelinux.net/torproject/dist/",
             httpsDistMirror => "https://fbnaia.homelinux.net/torproject//dist/",
             rsyncDistMirror => "",
aa56d98c
             hiddenServiceMirror => "",
fb696fce
     }
532901be
 );
 
 my $count = values %m;
 print "We have a total of $count mirrors\n";
 print "Fetching the last updated date for each mirror.\n";
 
3d7f7acd
 my $tortime;
3b0a6878
 $tortime = FetchDate("https://www.torproject.org/");
f80d2636
 # Adjust offical Tor time by out-of-date offset: number of days * seconds per day
 $tortime -= 1 * 172800;
3d7f7acd
 print "The official time for Tor is $tortime. \n";
 
532901be
 foreach my $server ( keys %m ) {
 
     print "Attempting to fetch from $m{$server}{'orgName'}\n";
 
     if ($m{$server}{'httpWebsiteMirror'}) {
         print "Attempt to fetch via HTTP.\n";
         $m{$server}{"updateDate"} = FetchDate("$m{$server}{'httpWebsiteMirror'}");
     } elsif ($m{$server}{'httpsWebsiteMirror'}) {
         print "Attempt to fetch via HTTPS.\n";
         $m{$server}{"updateDate"} = FetchDate("$m{$server}{'httpsWebsiteMirror'}");
     } elsif ($m{$server}{'ftpWebsiteMirror'}) {
         print "Attempt to fetch via FTP.\n";
         $m{$server}{"updateDate"} = FetchDate("$m{$server}{'ftpWebsiteMirror'}");
     } else {
         print "We were unable to fetch or store anything. We still have the following: $m{$server}{'updateDate'}\n";
     }
 
     print "We fetched and stored the following: $m{$server}{'updateDate'}\n";
 
  }
 
 
 print "We sorted the following mirrors by their date of last update: \n";
 foreach my $server ( sort { $m{$b}{'updateDate'} <=> $m{$a}{'updateDate'}} keys %m ) {
 
      print "\n";
      print "Mirror $m{$server}{'orgName'}: \n";
 
      foreach my $attrib ( sort keys %{$m{$server}} ) {
         print "$attrib = $m{$server}{$attrib}";
         print "\n";
      };
 }
 
 my $outFile = "include/mirrors-table.wmi";
 my $html;
 open(OUT, "> $outFile") or die "Can't open $outFile: $!";
 
940ab031
 # Here's where we open a file and print some wml include goodness
532901be
 # This is storted from last known recent update to unknown update times
 foreach my $server ( sort { $m{$b}{'updateDate'} <=> $m{$a}{'updateDate'}} keys %m ) {
 
bf099ff9
      my $time;
b57d3dbe
      if ( "$m{$server}{'updateDate'}" ne "Unknown") {
8c8f898f
 	  if ( $m{$server}{'updateDate'} > $tortime ) {
eafdc12d
 	    $time = "Up to date";
98ae0563
 	  } else { $time = "DO NOT USE. Out of date."; }
33d46751
      } else { $time = "Unknown"; }
759dd463
 print OUT <<"END";
      \n<tr>\n
          <td>$m{$server}{'isoCC'}</td>\n
          <td>$m{$server}{'orgName'}</td>\n
          <td>$time</td>\n
 END
 
      my %prettyNames = (
                         httpWebsiteMirror => "http",
                         httpsWebsiteMirror => "https",
                         ftpWebsiteMirror => "ftp",
                         rsyncWebsiteMirror => "rsync",
                         httpDistMirror => "http",
                         httpsDistMirror => "https",
98ae0563
                         rsyncDistMirror => "rsync", );
759dd463
 
      foreach my $precious ( sort keys %prettyNames )
532901be
      {
         if ($m{$server}{"$precious"}) {
             print OUT "    <td><a href=\"" . $m{$server}{$precious} . "\">" .
759dd463
                       "$prettyNames{$precious}</a></td>\n";
532901be
         } else { print OUT "    <td> - </td>\n"; }
      }
 
      print OUT "</tr>\n";
 }
 
 close(OUT);