# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+# Homer: Are you saying you're never going to eat any animal again? What
+# about bacon?
+# Lisa: No.
+# Homer: Ham?
+# Lisa: No.
+# Homer: Pork chops?
+# Lisa: Dad, those all come from the same animal.
+# Homer: Heh heh heh. Ooh, yeah, right, Lisa. A wonderful, magical animal.
+
# exit on errors
set -e
# make sure to only use defined variables
# Timestamp. Used for dinstall stat graphs
function ts() {
- TS=$(($TS+1));
- echo "Archive maintenance timestamp $TS ($1): $(date +%H:%M:%S)"
+ echo "Archive maintenance timestamp ($1): $(date +%H:%M:%S)"
}
# Cleanup actions
# If we error out this one is called, *FOLLOWED* by cleanup above
function onerror() {
ERRDATE=$(date "+%Y.%m.%d-%H:%M:%S")
- cat "$LOGFILE" | mail -s "ATTENTION ATTENTION! dinstall error at ${ERRDATE} (Be quiet, Brain, or I'll stab you with a Q-tip)" cron@ftp-master.debian.org
+
+ subject="ATTENTION ATTENTION!"
+ if [ "${error}" = "false" ]; then
+ subject="${subject} (continued)"
+ else
+ subject="${subject} (interrupted)"
+ fi
+ subject="${subject} dinstall error at ${ERRDATE} in ${STAGEFILE} - (Be quiet, Brain, or I'll stab you with a Q-tip)"
+
+ cat "${STAGEFILE}.log" | mail -s "${subject}" -a "X-Debian: DAK" cron@ftp-master.debian.org
}
########################################################################
# the actual dinstall functions follow #
########################################################################
-# Setup the notice file to tell bad mirrors they used the wrong time
-function notice() {
- rm -f "$NOTICE"
- cat > "$NOTICE" <<EOF
-Packages are currently being installed and indices rebuilt.
-Maintenance is automatic, starting at 01|07|13|19:52 UTC,
-and ending about an hour later. This file is then removed.
-
-You should not mirror the archive during this period.
-EOF
-}
-
# pushing merkels QA user, part one
function merkel1() {
log "Telling merkels QA user that we start dinstall"
function cruft() {
log "Checking for cruft in overrides"
dak check-overrides
-
- log "Fixing symlinks in $ftpdir"
- symlinks -d -r $ftpdir
}
function msfl() {
function fingerprints() {
log "Updating fingerprints"
dak import-keyring -L /srv/keyring.debian.org/keyrings/debian-keyring.gpg
+
+ OUTFILE=$(mktemp)
+ dak import-keyring --generate-users "%s" /srv/keyring.debian.org/keyrings/debian-maintainers.gpg >"${OUTFILE}"
+
+ if [ -s "${OUTFILE}" ]; then
+ /usr/sbin/sendmail -odq -oi -t -f envelope@ftp-master.debian.org <<EOF
+From: Debian FTP Masters <ftpmaster@ftp-master.debian.org>
+To: <debian-project@lists.debian.org>
+Subject: Debian Maintainers Keyring changes
+Content-Type: text/plain; charset=utf-8
+MIME-Version: 1.0
+
+The following changes to the debian-maintainers keyring have just been activated:
+
+$(cat $OUTFILE)
+
+Debian distribution maintenance software,
+on behalf of the Keyring maintainers
+
+EOF
+ fi
+ rm -f "$OUTFILE"
}
function overrides() {
function packages() {
log "Generating Packages and Sources files"
cd $configdir
+ GZIP='--rsyncable' ; export GZIP
apt-ftparchive generate apt.conf
}
make_buildd_dir
}
+function mklslar() {
+ cd $ftpdir
+
+ FILENAME=ls-lR
+
+ log "Removing any core files ..."
+ find -type f -name core -print0 | xargs -0r rm -v
+
+ log "Checking permissions on files in the FTP tree ..."
+ find -type f \( \! -perm -444 -o -perm +002 \) -ls
+ find -type d \( \! -perm -555 -o -perm +002 \) -ls
+
+ log "Checking symlinks ..."
+ symlinks -rd .
+
+ log "Creating recursive directory listing ... "
+ rm -f .${FILENAME}.new
+ TZ=UTC ls -lR > .${FILENAME}.new
+
+ if [ -r ${FILENAME}.gz ] ; then
+ mv -f ${FILENAME}.gz ${FILENAME}.old.gz
+ mv -f .${FILENAME}.new ${FILENAME}
+ rm -f ${FILENAME}.patch.gz
+ zcat ${FILENAME}.old.gz | diff -u - ${FILENAME} | gzip --rsyncable -9cfn - >${FILENAME}.patch.gz
+ rm -f ${FILENAME}.old.gz
+ else
+ mv -f .${FILENAME}.new ${FILENAME}
+ fi
+
+ gzip --rsyncable -9cfN ${FILENAME} >${FILENAME}.gz
+ rm -f ${FILENAME}
+}
+
+function mkmaintainers() {
+ log -n 'Creating Maintainers index ... '
+
+ cd $indices
+ dak make-maintainers ${scriptdir}/masterfiles/pseudo-packages.maintainers | \
+ sed -e "s/~[^ ]*\([ ]\)/\1/" | awk '{printf "%-20s ", $1; for (i=2; i<=NF; i++) printf "%s ", $i; printf "\n";}' > .new-maintainers
+
+ set +e
+ cmp .new-maintainers Maintainers >/dev/null
+ rc=$?
+ set -e
+ if [ $rc = 1 ] || [ ! -f Maintainers ] ; then
+ log -n "installing Maintainers ... "
+ mv -f .new-maintainers Maintainers
+ gzip --rsyncable -9v <Maintainers >.new-maintainers.gz
+ mv -f .new-maintainers.gz Maintainers.gz
+ elif [ $rc = 0 ] ; then
+ log '(same as before)'
+ rm -f .new-maintainers
+ else
+ log cmp returned $rc
+ false
+ fi
+}
+
+function copyoverrides() {
+ log 'Copying override files into public view ...'
+
+ for f in $copyoverrides ; do
+ cd $overridedir
+ chmod g+w override.$f
+
+ cd $indices
+ rm -f .newover-$f.gz
+ pc="`gzip 2>&1 -9nv <$overridedir/override.$f >.newover-$f.gz`"
+ set +e
+ nf=override.$f.gz
+ cmp -s .newover-$f.gz $nf
+ rc=$?
+ set -e
+ if [ $rc = 0 ]; then
+ rm -f .newover-$f.gz
+ elif [ $rc = 1 -o ! -f $nf ]; then
+ echo " installing new $nf $pc"
+ mv -f .newover-$f.gz $nf
+ chmod g+w $nf
+ else
+ echo $? $pc
+ exit 1
+ fi
+ done
+}
+
function scripts() {
log "Running various scripts from $scriptsdir"
cd $scriptsdir
- ./mkmaintainers
- ./copyoverrides
- ./mklslar
+ mkmaintainers
+ copyoverrides
+ mklslar
./mkfilesindices
./mkchecksums
}
function mirror() {
echo "Regenerating \"public\" mirror/ hardlink fun"
cd ${mirrordir}
- rsync -aH --link-dest ${ftpdir} --exclude Archive_Maintenance_In_Progress --delete --delete-after --ignore-errors ${ftpdir}/. .
+ rsync -aH --link-dest ${ftpdir} --delete --delete-after --ignore-errors ${ftpdir}/. .
}
function wb() {
ssh -2 -o BatchMode=yes -o SetupTimeOut=30 -o ConnectTimeout=30 -i ~/.ssh/push_merkel_ddaccess dak@merkel.debian.org sleep 1
}
-function runparts() {
- log "Using run-parts to run scripts in $base/scripts/distmnt"
- run-parts --report $base/scripts/distmnt
+function mirrorpush() {
+ log "Starting the mirrorpush"
+ date -u > /srv/ftp.debian.org/web/mirrorstart
+ echo "Using dak v1" >> /srv/ftp.debian.org/web/mirrorstart
+ echo "Running on host $(hostname -f)" >> /srv/ftp.debian.org/web/mirrorstart
+ sudo -H -u archvsync /home/archvsync/runmirrors > ~dak/runmirrors.log 2>&1 &
}
function i18n2() {
dak control-suite -l testing > squeeze
dak control-suite -l unstable > sid
echo "${STAMP}" > timestamp
- gpg --secret-keyring /srv/ftp.debian.org/s3kr1t/dot-gnupg/secring.gpg --keyring /srv/ftp.debian.org/s3kr1t/dot-gnupg/pubring.gpg --no-options --batch --no-tty --armour --default-key 6070D3A1 --detach-sign -o timestamp.gpg timestamp
+ gpg --secret-keyring /srv/ftp.debian.org/s3kr1t/dot-gnupg/secring.gpg --keyring /srv/ftp.debian.org/s3kr1t/dot-gnupg/pubring.gpg --no-options --batch --no-tty --armour --default-key 55BE302B --detach-sign -o timestamp.gpg timestamp
rm -f md5sum
md5sum * > md5sum
cd ${webdir}/
find -maxdepth 1 -mindepth 1 -type f -name 'dump_*' \! -name '*.bz2' \! -name '*.gz' -mmin +720 |
while read dumpname; do
echo "Compressing $dumpname"
- bzip2 -9v "$dumpname"
+ bzip2 -9fv "$dumpname"
done
find -maxdepth 1 -mindepth 1 -type f -name "dumpall_*" \! -name '*.bz2' \! -name '*.gz' -mmin +720 |
while read dumpname; do
echo "Compressing $dumpname"
- bzip2 -9v "$dumpname"
+ bzip2 -9fv "$dumpname"
done
finddup -l -d $base/backup
}
function renamelogfile() {
if [ -f "${dbdir}/dinstallstart" ]; then
NOW=$(cat "${dbdir}/dinstallstart")
- maillogfile
- mv "$LOGFILE" "$logdir/dinstall_${NOW}.log"
+# maillogfile
+ mv "$LOGFILE" "$logdir/dinstall_${NOW}.log"
logstats "$logdir/dinstall_${NOW}.log"
bzip2 -9 "$logdir/dinstall_${NOW}.log"
else
error "Problem, I don't know when dinstall started, unable to do log statistics."
NOW=`date "+%Y.%m.%d-%H:%M:%S"`
- maillogfile
+# maillogfile
mv "$LOGFILE" "$logdir/dinstall_${NOW}.log"
bzip2 -9 "$logdir/dinstall_${NOW}.log"
fi
# Function to save which stage we are in, so we can restart an interrupted
# dinstall. Or even run actions in parallel, if we dare to, by simply
# backgrounding the call to this function. But that should only really be
-# done for things we dont care much about.
+# done for things we don't care much about.
#
# This should be called with the first argument being an array, with the
# members
# - FUNC - the function name to call
# - ARGS - Possible arguments to hand to the function. Can be the empty string
-# - TS - The timestamp name. Can be the empty string
+# - TIME - The timestamp name. Can be the empty string
# - ERR - if this is the string false, then the call will be surrounded by
# set +e ... set -e calls, so errors in the function do not exit
# dinstall. Can be the empty string, meaning true.
ARGS='GO[@]'
local "${!ARGS}"
- if [ -f "${stagedir}/${FUNC}" ]; then
- stamptime=$(/usr/bin/stat -c %Z "${stagedir}/${FUNC}")
+ error=${ERR:-"true"}
+
+ STAGEFILE="${stagedir}/${FUNC}"
+ if [ -f "${STAGEFILE}" ]; then
+ stamptime=$(/usr/bin/stat -c %Z "${STAGEFILE}")
unixtime=$(date +%s)
difference=$(( $unixtime - $stamptime ))
if [ ${difference} -ge 14400 ]; then
return
fi
- debug "Now calling function ${FUNC}. Arguments: ${ARGS}. Timestamp: ${TS}"
+ debug "Now calling function ${FUNC}. Arguments: ${ARGS}. Timestamp: ${TIME}"
# Make sure we are always at the same place. If a function wants to be elsewhere,
# it has to cd first!
cd ${configdir}
+ # Now redirect the output into $STAGEFILE.log. In case it errors out somewhere our
+ # errorhandler trap can then mail the contents of $STAGEFILE.log only, instead of a whole
+ # dinstall logfile. Short error mails ftw!
+ exec >> "${STAGEFILE}.log" 2>&1
+
if [ -f "${LOCK_STOP}" ]; then
log "${LOCK_STOP} exists, exiting immediately"
exit 42
fi
- if [ "${ERR}" = "false" ]; then
+ if [ "${error}" = "false" ]; then
set +e
fi
${FUNC} ${ARGS}
# Make sure we are always at the same place.
cd ${configdir}
- touch "${stagedir}/${FUNC}"
+ touch "${STAGEFILE}"
if [ -n "${TIME}" ]; then
ts "${TIME}"
fi
+ # And the output goes back to the normal logfile
+ exec >> "$LOGFILE" 2>&1
+
+ # Now we should make sure that we have a usable dinstall.log, so append the $STAGEFILE.log
+ # to it.
+ cat "${STAGEFILE}.log" >> "${LOGFILE}"
+ rm -f "${STAGEFILE}.log"
+
if [ -f "${LOCK_STOP}" ]; then
log "${LOCK_STOP} exists, exiting immediately"
exit 42
# Marker for dinstall end
DINSTALLEND="${lockdir}/dinstallend"
-# Timestamps start at -1. so first gets 0
-TS=-1
touch "${DINSTALLSTART}"
ts "startup"
-# Tell everyone we are doing some work
-NOTICE="$ftpdir/Archive_Maintenance_In_Progress"
-
# lock cron.unchecked (it immediately exits when this exists)
LOCK_DAILY="$lockdir/daily.lock"
ARGS=""
ERR="false"
)
-stage $GO
+stage $GO &
GO=(
FUNC="pgdump_pre"
ARGS=""
ERR="false"
)
-stage $GO
+stage $GO &
GO=(
FUNC="punew"
ARGS=""
ERR="false"
)
-stage $GO
+stage $GO &
lockfile "$LOCK_ACCEPTED"
lockfile "$LOCK_NEW"
ARGS=""
ERR="false"
)
-stage $GO
+stage $GO &
GO=(
FUNC="overrides"
ARGS=""
ERR=""
)
-stage $GO
+stage $GO &
-rm -f "${NOTICE}"
rm -f "${LOCK_DAILY}"
ts "locked part finished"
ARGS=""
ERR=""
)
-stage $GO
+stage $GO &
GO=(
FUNC="expire"
ARGS=""
ERR=""
)
-stage $GO
+stage $GO &
GO=(
FUNC="transitionsclean"
ARGS=""
ERR=""
)
-stage $GO
+stage $GO &
GO=(
FUNC="reports"
ARGS=""
ERR=""
)
-stage $GO
+stage $GO &
GO=(
FUNC="dm"
ARGS=""
ERR=""
)
-stage $GO
+stage $GO &
GO=(
FUNC="bts"
ARGS=""
ERR="false"
)
-stage $GO
+stage $GO &
GO=(
FUNC="merkel2"
ARGS=""
ERR="false"
)
-stage $GO
+stage $GO &
GO=(
- FUNC="runparts"
- TIME="run-parts"
+ FUNC="mirrorpush"
+ TIME="mirrorpush"
ARGS=""
ERR="false"
)
ARGS=""
ERR="false"
)
-stage $GO
+stage $GO &
GO=(
FUNC="testingsourcelist"
ARGS=""
ERR="false"
)
-stage $GO
-
-GO=(
- FUNC="aptftpcleanup"
- TIME="apt-ftparchive cleanup"
- ARGS=""
- ERR="false"
-)
-stage $GO
+stage $GO &
GO=(
FUNC="merkel3"
ARGS=""
ERR="false"
)
-stage $GO
+stage $GO &
GO=(
FUNC="compress"
ARGS=""
ERR=""
)
+stage $GO &
+
+GO=(
+ FUNC="aptftpcleanup"
+ TIME="apt-ftparchive cleanup"
+ ARGS=""
+ ERR="false"
+)
stage $GO
log "Daily cron scripts successful, all done"