#!/bin/bash # 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 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/pub # These strings will be eval'ed later with $mod replaced by its value in # context. FILELIST=fullfilelist TIMELIST='fullfiletimelist-$mod' ( # 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. tmpd=$(mktemp -d -t create-filelist.XXXXXXXXXX) trap "rm -rf $tmpd" EXIT cd $tmpd # 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