From c54d26a9f97ac9fbdc89dfb88a8fa8dfd7686b72 Mon Sep 17 00:00:00 2001 From: Kevin Fenzi Date: Sat, 28 May 2016 16:41:34 +0000 Subject: [PATCH] Update new version from upstream --- files/scripts/update-fullfiletimelist | 90 ++++++++++++++++++++------- 1 file changed, 68 insertions(+), 22 deletions(-) diff --git a/files/scripts/update-fullfiletimelist b/files/scripts/update-fullfiletimelist index 04e6e0b584..415a780686 100755 --- a/files/scripts/update-fullfiletimelist +++ b/files/scripts/update-fullfiletimelist @@ -1,33 +1,79 @@ -#!/bin/sh +#!/bin/bash -MOD=$1 -[ -z "$MOD" ] && { - echo "usage: $0 " +# Note: this is only an example of how you'd call create-filelist. Edit to fit +# your requirements. + +# 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. + +mods=$* + +if [[ -z $mods ]]; then + echo "usage: $0 [ ...]" exit 2 -} +fi -TOPD=/srv/pub/ -FILELIST=fullfilelist -TIMELIST=fullfiletimelist-$MOD -LOCKFILE=.lock.$TIMELIST CREATE=/usr/local/bin/create-filelist +# A single lockfile for everything we're modifying +LOCKFILE=.lock.create-filelist + +# The directory where all of the modules live +TOPD=/srv/mirror/pub + +# These strings will be eval'ed later with $mod replaced by its value in +# context. +FILELIST=fullfilelist +TIMELIST='fullfiletimelist-$mod' + ( - flock -n 9 || exit 1 + # We want to wait forever until we can do what we're asked + flock -x 9 - TMPD=$(mktemp -d -t create-filelist.XXXXXXXXXX) - trap "rm -rf $TMPD" EXIT - cd $TMPD + # 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. - $CREATE -c -s -d $TOPD/$MOD -f $FILELIST -t $TIMELIST - if diff -q $FILELIST $TOPD/$MOD/$FILELIST > /dev/null; then - mv $FILELIST $TOPD/$MOD/$FILELIST - chmod 0644 $TOPD/$MOD/$FILELIST - fi + tmpd=$(mktemp -d -t create-filelist.XXXXXXXXXX) + trap "rm -rf $tmpd" EXIT + cd $tmpd - if diff -q $TIMELIST $TOPD/$MOD/$TIMELIST > /dev/null; then - mv $TIMELIST $TOPD/$MOD/$TIMELIST - chmod 0644 $TOPD/$MOD/$TIMELIST - fi + # Create all of the filelists + for mod in $mods; do + $CREATE -c -s -d $TOPD/$mod-f fl-$mod -t tl-$mod + done + + # Now diff the file lists and delete the ones which didn't change + for mod in $mods; do + currentfl=$TOPD/$mod/${FILELIST/'$mod'/$mod} + currenttl=$TOPD/$mod/${TIMELIST/'$mod'/$mod} + + # If a file list exsts and doesn't differ from what we just generated, + # delete the latter. + if [[ -f $currentfl ]] && diff -q fl-$mod $currentfl > /dev/null; then + rm -f $fl + fi + if [[ -f $currenttl ]] && diff -q tl-$mod $currenttl > /dev/null; then + rm -f $fl + fi + done + + # And finally, move all of the files which need updating into place + for mod in $mods; do + currentfl=$TOPD/$mod/${FILELIST/'$mod'/$mod} + currenttl=$TOPD/$mod/${TIMELIST/'$mod'/$mod} + + if [[ -f fl-$mod ]]; then + chmod 644 fl-$mod + cp -p fl-$mod $currentfl + fi + if [[ -f tl-$mod ]]; then + chmod 644 tl-$mod + cp -p tl-$mod $currenttl + fi + done ) 9>$LOCKFILE