summaryrefslogtreecommitdiff
path: root/Master/tlpkg/bin/tl-update-ctan-mirrors
blob: a7404222337689d5fb007c9865227210ad3c7f4b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#!/usr/bin/perl

# needed file:
# http://ctan.org/mirrors (CTAN.sites, README.mirrors)
# rsync://comedy.dante.de/MirMon/mirmon.state

use strict;
$^W = 1;
use Data::Dumper;

if (!defined($ARGV[0])) {
  die ("Need the location of README.mirror as argument\n");
}
if (!defined($ARGV[1])) {
  die ("Need the location of mirmon.state file as argument\n");
}

open FOO, "<$ARGV[0]" || die("Cannot open $ARGV[0]: $!");
open MSTATE, "<$ARGV[1]" || die("Cannot open $ARGV[1]: $!");

my %good_urls;

read_mstate();
my %foo = read_readme_mirror();
$Data::Dumper::Indent = 1;
print Data::Dumper->Dump([\%foo], [qw(mirrors)]);

sub read_mstate {
  my %mstate;
  while (<MSTATE>) {
    my ($m, $age, $status_last_probe, $time_last_succesful_probe,
      $probe_history, $state_history, $last_probe) = split ' ';
    if ($status_last_probe eq "ok") {
      $good_urls{$m} = 1;
    } else {
      $good_urls{$m} = 0;
    }
  }
  close(MSTATE);
}

sub add_mirror {
  my ($mirref, $continent, $country, $mirror, $p, $ppath) = @_;
  my $url = "$p://$ppath";
  if (defined($good_urls{$url})) {
    if ($good_urls{$url}) {
      #$mirref->{$continent}{$country}{$mirror}{'protocols_path'}{$p} = $ppath;
      $mirref->{$continent}{$country}{$url} = 1;
    } else {
      printf STDERR "mirror seems to be dead, skipped: $url\n";
    }
  } else {
    printf STDERR "mirror not in mirmon file, skipped: $url\n";
  }
}

sub read_readme_mirror {
  my %mirrors;
  my $continent;
  my $mirror;
  my $country;
  my %protocols;
  while (<FOO>) {
    chomp;
    if (m/^ (Africa|Asia|Australasia|Europe|North America|South America)/) {
      my $save_continent = $1;
      if (defined($mirror)) {
        for my $p (keys %protocols) {
	  add_mirror(\%mirrors, $continent, $country, $mirror, $p, $protocols{$p});
        }
      }
      $continent = $save_continent;
      $mirror = undef;
      $country = undef;
      %protocols = ();
      next;
    }
    next if (!defined($continent));
    if (m/^  ([-a-zA-Z0-9.]+) \((.*)\)\s*$/) {
      my $save_mirror = $1;
      my $save_country = $2;
      # make country names more reasonable
      $save_country =~ s/^The //;
      if (defined($mirror)) {
        for my $p (keys %protocols) {
	  add_mirror(\%mirrors, $continent, $country, $mirror, $p, $protocols{$p});
        }
      }
      $mirror = $save_mirror;
      $country = $save_country;
      %protocols = ();
      next;
    }
    next if (!defined($mirror));
    if (m!^   URL: (ftp|http|rsync)://([-a-zA-Z0-9.]+)/([-\w/]*)!) {
      $protocols{$1} = "$2/$3";
      next;
    }
    #print "ignored >>$_<<\n";
  }
  return %mirrors;
}