ansible/files/scripts/update-fullfiletimelist
Adam Williamson 45d8ea3f89 Generate filtered file lists for fedfind to use
This adds `filterlist` files alongside the `fullfilelist` and
`fullfiletimelist` files. These are much, much shorter lists
which skip the entries for packages, ARM device tree boot files
and directories. They are intended for consumption by fedfind,
so it can stop using rync scraping to discover the image files
it looks for. To enable this, we update to a newer version of
`create-filelist` from upstream `quick-fedora-mirror` and make
`update-fullfiletimelist` create the filterlist files as well.

We also delete a couple of old copies of `create-filelist`;
nirik made the two roles that use it share a common copy a few
months back, but missed deleting the copy each role had in its
`files` directory.
2016-11-19 15:15:53 -08:00

165 lines
4.9 KiB
Bash
Executable file

#!/bin/bash
# Note: this is only an example of how you'd call create-filelist. Edit to fit
# your requirements. Note that you must supply a valid path for the lockfile,
# and it must be outside of your repository unless you want that lockfile to
# show up in your file lists.
# Takes a list of module names. Generates file lists for all of them and them
# moves them into place at once. If you are creating hardlinks between rsync
# modules, it is required that you update the file lists of both mirrors at the
# same time. Otherwise the clients may make separate copies of the files.
# The directory where all of the modules live
# Or pass it with -t
TOPD=/srv/mirror/pub
# The modules to process. Or pass them on the command line.
MODS=()
# Path to the create-filelist program.
# Or specify it with -p.
CREATE=/usr/local/bin/create-filelist
# These strings will be eval'ed later with $mod replaced by its value in
# context.
FILELIST=fullfilelist
TIMELIST='fullfiletimelist-$mod'
FILTERLIST='filterlist-$mod'
usage () {
echo
echo "Usage: $0 [-l lockfile] [-p creator path] [-t top directory] module [module ...]"
echo
echo " -l: Path to the lock file"
echo " -p: Path to the create-filelist program"
echo " -t: Path to directory containing modules"
echo
echo "At least one module to process must be provided."
echo "All paths must be absolute."
}
while [[ $# > 0 ]]; do
opt=$1
case $opt in
-l)
LOCKFILE=$(realpath $2)
shift
;;
-p)
CREATE=$(realpath $2)
shift
;;
-t)
TOPD=$(realpath $2)
shift
;;
-*)
(>&2 echo "Unknown option $opt."; usage)
exit 1
;;
*) # Remaining args are modules
MODS+=($opt)
;;
esac
shift
done
if [[ -z $LOCKFILE ]]; then
(>&2 echo "Must specify LOCKFILE, either by editing the source or via the -l option."; usage)
exit 2
fi
if [[ ! -d $(dirname $LOCKFILE) ]]; then
(>&2 echo "Given directory $(dirname $LOCKFILE) does not exist."; usage)
exit 2
fi
if [[ ! -f $CREATE ]]; then
(>&2 echo "Specified executable $CREATE does not exist."; usage)
exit 2
fi
if [[ ! -d $TOPD ]]; then
(>&2 echo "Provided directory $TOPD does not exist."; usage)
exit 2
fi
if [[ ${#MODS[@]} -eq 0 ]]; then
(>&2 echo "No modules specified"; usage)
exit 2
fi
tmpd=$(mktemp -d -t create-filelist.XXXXXXXXXX)
if [[ $? -ne 0 ]]; then
(>&2 echo "Creating temporary directory failed?")
exit 1
fi
trap "rm -rf $tmpd" EXIT
cd $tmpd
(
# We want to wait forever until we can do what we're asked
flock -x 9
# If you don't want to wait forever, try one of the following:
# flock -n 9 || exit 1 - Gives up immediately
# flock -w 120 9 || exit 1 - Waits 120 seconds and then gives up
# Don't change the '9', unless you change the last line of this script.
for mod in $MODS; do
currentfl=$TOPD/$mod/${FILELIST/'$mod'/$mod}
currenttl=$TOPD/$mod/${TIMELIST/'$mod'/$mod}
currentsl=$TOPD/$mod/${FILTERLIST/'$mod'/$mod}
flname=$(basename $currentfl)
tlname=$(basename $currenttl)
slname=$(basename $currentsl)
$CREATE -c -s -d $TOPD/$mod -f $flname -t $tlname -F $slname
# If a file list exists and doesn't differ from what we just generated,
# delete the latter.
if [[ -f $currentfl ]] && diff -q $currentfl $flname > /dev/null; then
rm -f $flname
fi
if [[ -f $currenttl ]] && diff -q $currenttl $tlname > /dev/null; then
rm -f $tlname
fi
if [[ -f $currentsl ]] && diff -q $currentsl $slname > /dev/null; then
rm -f $slname
fi
done
# Now we have the new file lists but in a temporary directory which
# probably isn't on the same filesystem. Copy them to temporary files in
# the right place.
for mod in $MODS; do
currentfl=$TOPD/$mod/${FILELIST/'$mod'/$mod}
currenttl=$TOPD/$mod/${TIMELIST/'$mod'/$mod}
currentsl=$TOPD/$mod/${FILTERLIST/'$mod'/$mod}
flname=$(basename $currentfl)
fldir=$(dirname $currentfl)
tlname=$(basename $currenttl)
tldir=$(dirname $currenttl)
slname=$(basename $currentsl)
sldir=$(dirname $currentsl)
if [[ -f $flname ]]; then
tmpf=$(mktemp -p $fldir $flname.XXXXXXXXXX)
cp -p $flname $tmpf
chmod 644 $tmpf
mv $tmpf $currentfl
fi
if [[ -f $tlname ]]; then
tmpf=$(mktemp -p $tldir $tlname.XXXXXXXXXX)
cp -p $tlname $tmpf
chmod 644 $tmpf
mv $tmpf $currenttl
fi
if [[ -f $slname ]]; then
tmpf=$(mktemp -p $sldir $slname.XXXXXXXXXX)
cp -p $slname $tmpf
chmod 644 $tmpf
mv $tmpf $currentsl
fi
done
) 9>$LOCKFILE