debian-cd-clone/tools/grab_checksums

146 lines
4.5 KiB
Bash
Executable File

#!/bin/sh
#
# grab_checksum
# (c) 2004-2019 Steve McIntyre <steve@einval.com>
#
# GPL v2
#
# Parse Packages and Sources files out of a mirror and pre-process
# them into a single list ready for mkisofs to check later
set -e
CHECKSUM=$1
MIRROR=$2
ARCHES="$3"
CODENAME=$4
DI_CODENAME=$5
OUT=$6
case $CHECKSUM in
md5|sha256)
# OK
;;
*)
echo "$0: Unsupported checksum specified: $CHECKSUM"
echo "Abort"
exit 1
;;
esac
export CHECKSUM
for ARCH in $ARCHES
do
LOCATIONS="$MIRROR/dists/$CODENAME/ $MIRROR/dists/$DI_CODENAME/"
if [ "$BACKPORTS"x != ""x ] ; then
LOCATIONS="$LOCATIONS $MIRROR/dists/$CODENAME-backports/"
fi
echo "Looking in $LOCATIONS"
for LOCATION in $LOCATIONS; do
if [ ! -d $LOCATION ]; then
echo "Error: $LOCATION is not a directory"
exit 1
fi
done
case $ARCH in
source)
FILES=`find $LOCATIONS -name Sources.gz -o -name Sources.xz`
echo "Using $CHECKSUM sums from Sources files:"
echo $FILES
$BASEDIR/tools/catz $FILES | \
MIRROR=$MIRROR CHECKSUM=$CHECKSUM perl -e '
chomp;
my %files;
my $dir;
my $filename;
my $mirror = $ENV{"MIRROR"};
my $checksum = $ENV{"CHECKSUM"};
while (<>) {
if (m/^ ([[:xdigit:]]{32}) (\d+) (\S+)/sg) {
$files{$3}{"md5"} = $1;
$files{$3}{"size"} = $2;
}
if (m/^ ([[:xdigit:]]{64}) (\d+) (\S+)/sg) {
$files{$3}{"sha256"} = $1;
$files{$3}{"size"} = $2;
}
if (m/^Directory: (\S+)/sg) {
$dir = $1;
}
if (m/^$/) {
for $filename (keys %files) {
printf("%s %12s %s/%s/%s\n",
$files{$filename}{$checksum},
$files{$filename}{"size"},
$mirror, $dir, $filename);
}
undef %files;
}
}' | sort | uniq >> $OUT
;;
*)
FILES=`find $LOCATIONS -name Packages.gz \
-o -name Packages.xz | grep binary-$ARCH`
echo "Using $CHECKSUM sums from Packages files:"
echo $FILES
NUM_FILES=`echo $FILES| wc -w`
if [ $NUM_FILES -eq 1 ] ; then
echo "No files found for arch $ARCH. Abort!"
exit 1
fi
$BASEDIR/tools/catz $FILES | \
MIRROR=$MIRROR CHECKSUM=$CHECKSUM perl -e '
chomp;
my $mirror = $ENV{"MIRROR"};
my $checksum = $ENV{"CHECKSUM"};
my $filename;
my $size;
my $sum;
while (<>) {
if (m/^Filename: (\S+)/sg) {
$filename = $1;
}
if (m/^Size: (\S+)/sg) {
$size = $1;
}
if ($checksum eq "md5" and (m/^MD5sum: (\S+)/sg)) {
$sum = $1;
} elsif ($checksum eq "sha256" and (m/^SHA256: (\S+)/sg)) {
$sum = $1;
}
if (m/^$/) {
printf("%s %12s %s/%s\n", $sum, $size, $mirror, $filename);
$sum = "";
}
}' | sort | uniq >> $OUT
# Use the new D-I images. Do NOT use the "current"
# link; it causes problems with overlaid files...
for VER in $MIRROR/dists/$DI_CODENAME/main/installer-$ARCH/*
do
if [ -d $VER ] && [ ! -L $VER ] ; then
if [ $CHECKSUM = md5 ]; then
FILE=$VER/images/MD5SUMS
else
FILE=$VER/images/SHA256SUMS
fi
echo "Using $CHECKSUM sums from d-i: $FILE"
LOC=dists/$DI_CODENAME/main/installer-$ARCH/`basename $VER`/images
for ENTRY in `cat $FILE | sed 's/ /:/g'`
do
PATH=`echo $ENTRY | /bin/sed "s?^.*:\./?$MIRROR/$LOC/?g"`
CSUM=`echo $ENTRY | /bin/sed 's/:.*$//g'`
SIZE=`/usr/bin/stat -c %s $PATH`
printf '%s %12.12s %s\n' $CSUM $SIZE $PATH
done | sort | uniq >> $OUT
fi
done
;;
esac
done
exit 0