#!/usr/bin/env perl -w # # $FreeBSD$ # # Author: Edwin Groothuis # # # 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}); my $errors=0; my $checked=0; 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=; chomp(@lines); close(FIN); my %MD5=(); my %SHA256=(); my %SIZE=(); foreach my $line (@lines) { 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; } } foreach my $f (sort(keys(%MD5))) { if (!defined ($SHA256{$f})) { print "$c/$p - Missing SHA256 for $f\n"; $SHA256{$f}="missing"; $errors++; } if ($MD5{$f} ne "IGNORE") { if (!defined ($SIZE{$f})) { print "$c/$p - Missing SIZE for $f\n"; $SIZE{$f}="missing"; $errors++; } } $checked++; } foreach my $f (sort(keys(%SHA256))) { if (!defined ($MD5{$f})) { print "$c/$p - Missing MD5 for $f\n"; $MD5{$f}="missing"; $errors++; } if ($SHA256{$f} ne "IGNORE") { if (!defined ($SIZE{$f})) { print "$c/$p - Missing SIZE for $f\n"; $SIZE{$f}="missing"; $errors++; } } } foreach my $f (sort(keys(%SIZE))) { if (!defined ($MD5{$f})) { print "$c/$p - Missing MD5 for $f\n"; $MD5{$f}="missing"; $errors++; } if (!defined ($SHA256{$f})) { print "$c/$p - Missing SHA256 for $f\n"; $SHA256{$f}="missing"; $errors++; } } } closedir(DHUPC); } closedir(DHUP); print "Errors: $errors\nChecked: $checked\n";