#!/bin/bash LOCKFILE=/var/run/sync-mirrors/lockfile LOGFILE=/var/log/sync-mirrors/sync-mirrors-`date +%Y%m%d%H%M%S`.log CONFDIR=/etc/sync-mirrors usage() { echo "Usage: `basename $0` [-v] [mirror]" 1>&2 echo " `basename $0` -l" 1>&2 } if [ -d ${CONFDIR} ]; then MIRRORLIST=`ls ${CONFDIR}/*.conf 2> /dev/null | while read f ; \ do basename $f | sed -e 's/\.conf$//' ; done` if [ "${MIRRORLIST}" = "" ]; then echo "ERR: No configured mirrors found" 1>&2 exit 1 fi else echo "ERR: Config directory [${CONFDIR}] missing" 1>&2 exit 1 fi VERBOSE=0 EXTRA_OPTS="" while getopts "vhl" c ; do case $c in v) VERBOSE=1 EXTRA_OPTS="-v --progress" ;; h) usage exit 1 ;; l) echo "Available mirrors:" for name in ${MIRRORLIST} ; do echo " ${name}" done exit 0 ;; esac done shift `expr $OPTIND - 1` if [ $# -gt 0 ]; then for mirror in $* ; do if [ ! -f ${CONFDIR}/$1.conf ]; then echo "ERR: No mirror named [$1]" 1>&2 exit 1 fi SYNC="${MIRRORS} $1" shift done else SYNC=${MIRRORLIST} fi if [ `whoami` != mirror ]; then echo "ERR: Script needs to be run as mirror user" 1>&2 exit 1 fi umask 022 if [ -f ${LOCKFILE} ]; then kill -0 `cat ${LOCKFILE}` if [ $? -ne 1 ]; then which stat > /dev/null 2>&1 if [ $? -eq 0 ]; then STARTED=" (`stat ${LOCKFILE} | sed -n 's/^Modify: \(.*\)/\1/p'`)" else STARTED="" fi echo "ERR: Lockfile exists${STARTED}, exiting" 1>&2 exit 1 else echo "WARN: Removing stale lock file..." 1>&2 rm -f ${LOCKFILE} fi fi trap "rm -f ${LOCKFILE}" INT TERM EXIT echo $$ > ${LOCKFILE} for mirror in ${SYNC} ; do POSTCMD="" SRC="" RSYNCOPTS="" . ${CONFDIR}/${mirror}.conf if [ "${SRC}" = "" ]; then echo "ERR: No SRC set for mirror ${mirror} ..." 1>&2 exit 1 fi [ ${VERBOSE} -eq 1 ] && echo "Starting ${mirror} sync ..." echo "`date '+%Y/%m/%d %H:%M:%S'` [$$] Starting ${mirror} sync ..." \ >> ${LOGFILE} rsync -aH -4 ${EXTRA_OPTS} --numeric-ids --delete --delete-delay \ --delay-updates --no-motd ${RSYNCOPTS} --log-file=${LOGFILE} \ --exclude=.~tmp~/ ${SRC} /srv/mirrors/${mirror}/ if [ $? -ne 0 ]; then echo "WARN: Encountered errors on ${mirror} sync, see ${LOGFILE} for details" 1>&2 fi if [ "${POSTCMD}" != "" ]; then [ ${VERBOSE} -eq 1 ] && echo "Running post for ${mirror} ..." echo "`date '+%Y/%m/%d %H:%M:%S'` [$$] Running post for ${mirror} ..." \ >> ${LOGFILE} ${POSTCMD} 2>&1 | awk \ "{ print strftime(\"%Y/%m/%d %H:%M:%S\") \" [$$] \" \$0 }" \ >> ${LOGFILE} fi done rm -f ${LOCKFILE}