comparison _test/read_repo.pl @ 1:30a88ad2b2fd

added validation mode and automatic errors fixing
author cin
date Tue, 22 Oct 2013 05:36:00 +0400
parents 93b83e3c38d6
children f2a86753b494
comparison
equal deleted inserted replaced
0:93b83e3c38d6 1:30a88ad2b2fd
28 ); 28 );
29 29
30 my $repoUrl = 30 my $repoUrl =
31 'http://download.opensuse.org/repositories/Mono/openSUSE_12.3/'; 31 'http://download.opensuse.org/repositories/Mono/openSUSE_12.3/';
32 my $repoDir = 'repo'; 32 my $repoDir = 'repo';
33 my $validate = 0;
33 34
34 my $agent = UserAgent->new(); 35 my $agent = UserAgent->new();
35 $agent->env_proxy(); 36 $agent->env_proxy();
36 37
37 # список файлов, которые должны быть в репозитарии, заполняется по мере загрузки/проверки целостности 38 # список файлов, которые должны быть в репозитарии, заполняется по мере загрузки/проверки целостности
52 $mdLocation, 53 $mdLocation,
53 "repodata/repomd.xml.asc", 54 "repodata/repomd.xml.asc",
54 "repodata/repomd.xml.key" 55 "repodata/repomd.xml.key"
55 ); 56 );
56 57
57 foreach my $initLocation (@initial) { 58 $files{MakeLocalName($_)} = { location => "${repoUrl}$_" } foreach @initial;
58 my $file = MakeLocalName($initLocation); 59
59 $files{$file} = { location => "${repoUrl}$initLocation"}; 60 unless ($validate) {
60 my $resp = $agent->get( 61 foreach my $initLocation (@initial) {
61 "${repoUrl}$initLocation", 62 my $file = MakeLocalName($initLocation);
62 ':content_file' => $file 63 my $resp = $agent->get(
63 ); 64 "${repoUrl}$initLocation",
64 65 ':content_file' => $file
65 die "failed to load metadata $initLocation: ", $resp->code, " ", $resp->message 66 );
66 unless $resp->is_success; 67
68 die "failed to load metadata $initLocation: ", $resp->code, " ", $resp->message
69 unless $resp->is_success;
70 }
67 } 71 }
68 72
69 my $parser = MDParser->new(); 73 my $parser = MDParser->new();
70 $parser->Parse( { location => $mdFile, no_blanks => 1 } ); 74 $parser->Parse( { location => $mdFile, no_blanks => 1 } );
71 75
132 } 136 }
133 } 137 }
134 138
135 print "validating\n"; 139 print "validating\n";
136 140
141 my @bad;
142
137 while(my ($file,$md) = each %files) { 143 while(my ($file,$md) = each %files) {
138 if (my $checksum = $md->{checksum}) { 144 if (my $checksum = $md->{checksum}) {
139 if( my $type = $digestTypes{lc($checksum->{type})} ) { 145 if( my $type = $digestTypes{lc($checksum->{type})} ) {
140 if(open my $hfile, "<$file") { 146 if(open my $hfile, "<$file") {
141 binmode $hfile; 147 binmode $hfile;
144 150
145 print "\t$file: $digest ne $checksum->{value}\n"; 151 print "\t$file: $digest ne $checksum->{value}\n";
146 } else { 152 } else {
147 print "\t$file: ", -f $file ? "unable to open" : "missing","\n"; 153 print "\t$file: ", -f $file ? "unable to open" : "missing","\n";
148 } 154 }
155 push @bad,$md;
149 } else { 156 } else {
150 print "\t$file: unknown hash algorithm: $checksum->{type}\n"; 157 print "\t$file: unknown hash algorithm: $checksum->{type}\n";
151 } 158 }
152 } 159 }
153 } 160 }
154 161
155 print "files: ", scalar keys %files, "\n"; 162 print "fixing\n";
156 print "dirs: ", scalar keys %dirs, "\n"; 163
157 getc; 164 foreach my $md (@bad) {
165 my $location = $md->{location};
166
167 my $file = MakeLocalName($location);
168
169 my $size = sprintf("%0.2fM",$md->{size}/(1024*1024));
170 print "\tfetch $location [${size}]\n";
171
172 $agent->get("${repoUrl}$location", ":content_file" => $file);
173 }
174
175 print "total files: ", scalar keys %files, "\n";
158 176
159 sub MakeLocalName { 177 sub MakeLocalName {
160 my ($url) = @_; 178 my ($url) = @_;
161 179
162 my @parts = split /\//, $url; 180 my @parts = split /\//, $url;