2006-01-24 07:30:07 +00:00
|
|
|
#!/usr/bin/perl -w
|
|
|
|
|
|
|
|
#
|
|
|
|
# $FreeBSD$
|
|
|
|
#
|
|
|
|
# Author: Edwin Groothuis <edwin@FreeBSD.org>
|
|
|
|
#
|
|
|
|
|
|
|
|
#
|
|
|
|
# Small tool to find distinfo with missing MD5/SHA256/SIZE statements,
|
|
|
|
# based on the assumption that if there is one of the MD5/SHA256/SIZE
|
|
|
|
# statements, then there should be all of them (except for SIZE
|
|
|
|
# when MD5/SHA256 is set to IGNORE).
|
|
|
|
#
|
|
|
|
# Usage: distinfochecker [-v] [-d directory]
|
|
|
|
# -v - verbose (print)
|
|
|
|
# -d - use directory instead of /usr/ports
|
|
|
|
#
|
|
|
|
|
|
|
|
use Getopt::Std;
|
|
|
|
use strict;
|
|
|
|
use Data::Dumper;
|
|
|
|
|
|
|
|
my $UP="/usr/ports";
|
|
|
|
my $verbose=0;
|
|
|
|
|
|
|
|
my %opts=();
|
|
|
|
getopt('d:v',\%opts);
|
|
|
|
|
|
|
|
$UP=$opts{d} if (defined $opts{d});
|
|
|
|
$verbose=1 if (defined $opts{v});
|
|
|
|
|
2006-01-24 21:53:51 +00:00
|
|
|
my $errors=0;
|
|
|
|
my $checked=0;
|
|
|
|
|
2006-01-24 07:30:07 +00:00
|
|
|
opendir(DHUP,$UP);
|
|
|
|
while (my $c=readdir(DHUP)) {
|
|
|
|
|
|
|
|
next if ($c=~/^\./);
|
|
|
|
next if ($c=~/^[A-Z]/);
|
|
|
|
next if ($c=~/^distfiles/);
|
|
|
|
|
|
|
|
opendir(DHUPC,"$UP/$c");
|
|
|
|
while (my $p=readdir(DHUPC)) {
|
|
|
|
next if ($p=~/^\./);
|
|
|
|
next if ($p=~/^Makefile/);
|
|
|
|
|
|
|
|
if (!-f "$UP/$c/$p/distinfo") {
|
|
|
|
print "$c/$p - No distinfo found\n" if ($verbose);
|
|
|
|
next;
|
|
|
|
}
|
|
|
|
open(FIN,"$UP/$c/$p/distinfo");
|
|
|
|
my @lines=<FIN>;
|
|
|
|
chomp(@lines);
|
|
|
|
close(FIN);
|
|
|
|
|
|
|
|
my %MD5=();
|
|
|
|
my %SHA256=();
|
|
|
|
my %SIZE=();
|
|
|
|
|
|
|
|
foreach my $line (@lines) {
|
2006-01-24 21:53:51 +00:00
|
|
|
if ($line=~/^MD5 \((.+?)\) = (.+?)$/) {
|
|
|
|
if (defined $MD5{$1}) {
|
|
|
|
print "$c/$p - Duplicate MD5 for $1\n";
|
|
|
|
$errors++;
|
|
|
|
}
|
|
|
|
$MD5{$1}=$2;
|
|
|
|
}
|
|
|
|
if ($line=~/^SHA256 \((.+?)\) = (.+?)$/) {
|
|
|
|
if (defined $SHA256{$1}) {
|
|
|
|
print "$c/$p - Duplicate SHA256 for $1\n";
|
|
|
|
$errors++;
|
|
|
|
}
|
|
|
|
$SHA256{$1}=$2;
|
|
|
|
}
|
|
|
|
if ($line=~/^SIZE \((.+?)\) = (.+?)$/) {
|
|
|
|
if (defined $SIZE{$1}) {
|
|
|
|
print "$c/$p - Duplicate SIZE for $1\n";
|
|
|
|
$errors++;
|
|
|
|
}
|
|
|
|
$SIZE{$1}=$2;
|
|
|
|
}
|
2006-01-24 07:30:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
foreach my $f (sort(keys(%MD5))) {
|
|
|
|
if (!defined ($SHA256{$f})) {
|
|
|
|
print "$c/$p - Missing SHA256 for $f\n";
|
|
|
|
$SHA256{$f}="missing";
|
2006-01-24 21:53:51 +00:00
|
|
|
$errors++;
|
2006-01-24 07:30:07 +00:00
|
|
|
}
|
|
|
|
if ($MD5{$f} ne "IGNORE") {
|
|
|
|
if (!defined ($SIZE{$f})) {
|
|
|
|
print "$c/$p - Missing SIZE for $f\n";
|
|
|
|
$SIZE{$f}="missing";
|
2006-01-24 21:53:51 +00:00
|
|
|
$errors++;
|
2006-01-24 07:30:07 +00:00
|
|
|
}
|
|
|
|
}
|
2006-01-24 21:53:51 +00:00
|
|
|
$checked++;
|
2006-01-24 07:30:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
foreach my $f (sort(keys(%SHA256))) {
|
|
|
|
if (!defined ($MD5{$f})) {
|
|
|
|
print "$c/$p - Missing MD5 for $f\n";
|
|
|
|
$MD5{$f}="missing";
|
2006-01-24 21:53:51 +00:00
|
|
|
$errors++;
|
2006-01-24 07:30:07 +00:00
|
|
|
}
|
|
|
|
if ($SHA256{$f} ne "IGNORE") {
|
|
|
|
if (!defined ($SIZE{$f})) {
|
|
|
|
print "$c/$p - Missing SIZE for $f\n";
|
|
|
|
$SIZE{$f}="missing";
|
2006-01-24 21:53:51 +00:00
|
|
|
$errors++;
|
2006-01-24 07:30:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach my $f (sort(keys(%SIZE))) {
|
|
|
|
if (!defined ($MD5{$f})) {
|
|
|
|
print "$c/$p - Missing MD5 for $f\n";
|
|
|
|
$MD5{$f}="missing";
|
2006-01-24 21:53:51 +00:00
|
|
|
$errors++;
|
2006-01-24 07:30:07 +00:00
|
|
|
}
|
|
|
|
if (!defined ($SHA256{$f})) {
|
|
|
|
print "$c/$p - Missing SHA256 for $f\n";
|
|
|
|
$SHA256{$f}="missing";
|
2006-01-24 21:53:51 +00:00
|
|
|
$errors++;
|
2006-01-24 07:30:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
closedir(DHUPC);
|
|
|
|
}
|
|
|
|
closedir(DHUP);
|
2006-01-24 21:53:51 +00:00
|
|
|
|
|
|
|
print "Errors: $errors\nChecked: $checked\n";
|