diff options
Diffstat (limited to 'bin')
-rwxr-xr-x | bin/pushpdo | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/bin/pushpdo b/bin/pushpdo new file mode 100755 index 0000000..30b0b37 --- /dev/null +++ b/bin/pushpdo @@ -0,0 +1,112 @@ +#! /bin/bash + +set -e +set -u + +# psuhpdo script for Debian +# +# Copyright (C) 2008 Joerg Jaspert <joerg@debian.org> +# +# 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}" +mkdir -p "${LOCKDIR}" + +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}" -av --progress --stats ${MIRRORPATH} ${MUSER}@${MHOSTNAME}:/does/not/matter + log "Pushing ${MLNAME} done" >> ${LOG} + + set +e +done + +exit 0 |