#! /bin/bash set -e set -u # psuhpdo script for Debian # # Copyright (C) 2008 Joerg Jaspert # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; version 2. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # In case the admin somehow wants to have this script located someplace else, # he can set BASEDIR, and we will take that. If it is unset we take ${HOME} BASEDIR=${BASEDIR:-"${HOME}"} NAME="`basename $0`" # Read our config file . "${BASEDIR}/etc/${NAME}.conf" # Source our common functions . "${BASEDIR}/etc/common" # Set sane defaults if the configfile didn't do that for us. # The directory for our logfiles LOGDIR=${LOGDIR:-"${BASEDIR}/log"} # Our own logfile LOG=${LOG:-"${LOGDIR}/${NAME}.log"} # How many logfiles to keep LOGROTATE=${LOGROTATE:-14} # Our mirrorfile MIRRORS=${MIRRORS:-"${BASEDIR}/etc/${NAME}.mirror"} # used by log() PROGRAM=${PROGRAM:-"${NAME}-$(hostname -s)"} # extra ssh options we might want hostwide SSH_OPTS=${SSH_OPTS:-""} # Which ssh key to use? KEYFILE=${KEYFILE:-".ssh/pushpackages"} # which path to "mirror" MIRRORPATH=${MIRRORPATH:-"/org/packages.debian.org/mirror/"} # where to send mails to if [ "x$(hostname -s)x" != "x${MIRRORNAME%%.debian.org}x" ]; then # We are not on a debian.org host MAILTO=${MAILTO:-"root"} else # Yay, on a .debian.org host MAILTO=${MAILTO:-"mirrorlogs@debian.org"} fi if ! [ -f "${BASEDIR}/${KEYFILE}" ]; then error "SSH Key ${BASEDIR}/${KEYFILE} does not exist" >> ${LOG} exit 5 fi # Some sane defaults cd ${BASEDIR} umask 022 # Make sure we have our log and lock directories mkdir -p "${LOGDIR}" trap 'log "Pdopush done" >> ${LOG}; savelog "${LOG}" > /dev/null' EXIT log "Pushing pdo mirrors" >> ${LOG} # From here on we do *NOT* want to exit on errors. We don't want to # stop pushing mirrors just because we can't reach one of them. set +e # Now read our mirrorfile and push the mirrors defined in there. # We use grep to easily sort out all lines having a # in front of them or are empty. egrep -v '^[[:space:]]*(#|$)' "${MIRRORS}" | while read MLNAME MHOSTNAME MUSER MPROTO MKEYFILE; do # Process the two options that can be left blank in the config if [ -z ${MPROTO} ]; then MPROTO=2 fi if [ -z ${MKEYFILE} ]; then MKEYFILE="${BASEDIR}/${KEYFILE}" fi # Now, people can do stupid things and leave out the protocol, but # define a keyfile... if [ ${MPROTO} -ne 1 ] && [ ${MPROTO} -ne 2 ]; then error "Need a correct ssh protocol version for ${MLNAME}, skipping" >> ${LOG} continue fi # And finally, push the mirror log "Pushing ${MLNAME}" >> ${LOG} # This needs a limited ssh key on the other side, something like # no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="rsync --server -vlogDtpr . /srv/mirrors/packages.debian.org/",from="87.106.64.223,2001:8d8:80:11::35d,powell.debian.org" ssh-rsa..... rsync -e "ssh -i ${MKEYFILE} -${MPROTO} ${SSH_OPTS}" -av --stats "${MIRRORPATH}" ${MUSER}@${MHOSTNAME}:/does/not/matter >"${LOGDIR}/${MLNAME}.log" log "Pushing ${MLNAME} done" >> ${LOG} savelog ${LOGDIR}${MLNAME}.log set +e done exit 0