2 # No way I try to deal with a crippled sh just for POSIX foo.
4 # Copyright (C) 2009 Joerg Jaspert <joerg@debian.org>
6 # This program is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU General Public License as
8 # published by the Free Software Foundation; version 2.
10 # This program is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 # General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 # Homer: Are you saying you're never going to eat any animal again? What
25 # Lisa: Dad, those all come from the same animal.
26 # Homer: Heh heh heh. Ooh, yeah, right, Lisa. A wonderful, magical animal.
30 # make sure to only use defined variables
32 # ERR traps should be inherited from functions too. (And command
33 # substitutions and subshells and whatnot, but for us the functions is
34 # the important part here)
37 # import the general variable set.
38 export SCRIPTVARS=/srv/ftp.debian.org/dak/config/debian/vars
41 ########################################################################
43 ########################################################################
44 # common functions are "outsourced"
45 . "${configdir}/common"
47 # Timestamp. Used for dinstall stat graphs
49 echo "Archive maintenance timestamp ($1): $(date +%H:%M:%S)"
55 rm -f ${LOCK_ACCEPTED}
58 # If we error out this one is called, *FOLLOWED* by cleanup above
60 ERRDATE=$(date "+%Y.%m.%d-%H:%M:%S")
62 subject="ATTENTION ATTENTION!"
63 if [ "${error}" = "false" ]; then
64 subject="${subject} (continued)"
66 subject="${subject} (interrupted)"
68 subject="${subject} dinstall error at ${ERRDATE} in ${STAGEFILE} - (Be quiet, Brain, or I'll stab you with a Q-tip)"
70 cat "${STAGEFILE}.log" | mail -s "${subject}" -a "X-Debian: DAK" cron@ftp-master.debian.org
73 ########################################################################
74 # the actual dinstall functions follow #
75 ########################################################################
77 # pushing merkels QA user, part one
79 log "Telling merkels QA user that we start dinstall"
80 ssh -2 -i ~dak/.ssh/push_merkel_qa -o BatchMode=yes -o SetupTimeOut=90 -o ConnectTimeout=90 qa@merkel.debian.org sleep 1
83 # Create the postgres dump files
84 function pgdump_pre() {
85 log "Creating pre-daily-cron-job backup of projectb database..."
86 pg_dump projectb > $base/backup/dump_pre_$(date +%Y.%m.%d-%H:%M:%S)
89 function pgdump_post() {
90 log "Creating post-daily-cron-job backup of projectb database..."
92 POSTDUMP=$(date +%Y.%m.%d-%H:%M:%S)
93 pg_dump projectb > $base/backup/dump_$POSTDUMP
94 pg_dumpall --globals-only > $base/backup/dumpall_$POSTDUMP
95 ln -sf $base/backup/dump_$POSTDUMP current
96 ln -sf $base/backup/dumpall_$POSTDUMP currentall
99 # Load the dak-dev projectb
100 function pgdakdev() {
102 echo "drop database projectb" | psql -p 5433 template1
103 cat currentall | psql -p 5433 template1
104 createdb -p 5433 -T template0 projectb
105 fgrep -v '\connect' current | psql -p 5433 projectb
108 # Updating various files
110 log "Updating Bugs docu, Mirror list and mailing-lists.txt"
112 $scriptsdir/update-bugdoctxt
113 $scriptsdir/update-mirrorlists
114 $scriptsdir/update-mailingliststxt
115 $scriptsdir/update-pseudopackages.sh
118 # Process (oldstable)-proposed-updates "NEW" queue
119 function punew_do() {
120 cd "${queuedir}/${1}"
122 dak process-new -a -C COMMENTS >> REPORT || true
126 log "Doing automated p-u-new processing"
130 log "Doing automated o-p-u-new processing"
134 # The first i18n one, syncing new descriptions
136 log "Synchronizing i18n package descriptions"
137 # First sync their newest data
138 cd ${scriptdir}/i18nsync
139 rsync -aq --delete --delete-after ddtp-sync:/does/not/matter . || true
141 # Now check if we still know about the packages for which they created the files
142 # is the timestamp signed by us?
143 if $(gpgv --keyring /srv/ftp.debian.org/s3kr1t/dot-gnupg/pubring.gpg timestamp.gpg timestamp); then
144 # now read it. As its signed by us we are sure the content is what we expect, no need
145 # to do more here. And we only test -d a directory on it anyway.
146 TSTAMP=$(cat timestamp)
147 # do we have the dir still?
148 if [ -d ${scriptdir}/i18n/${TSTAMP} ]; then
150 if ${scriptsdir}/ddtp-i18n-check.sh . ${scriptdir}/i18n/${TSTAMP}; then
151 # Yay, worked, lets copy around
152 for dir in squeeze sid; do
153 if [ -d dists/${dir}/ ]; then
154 cd dists/${dir}/main/i18n
155 rsync -aq --delete --delete-after . ${ftpdir}/dists/${dir}/main/i18n/.
157 cd ${scriptdir}/i18nsync
160 echo "ARRRR, bad guys, wrong files, ARRR"
161 echo "Arf, Arf, Arf, bad guys, wrong files, arf, arf, arf" | mail -s "Don't you kids take anything. I'm watching you. I've got eye implants in the back of my head." debian-l10n-devel@lists.alioth.debian.org
164 echo "ARRRR, missing the timestamp ${TSTAMP} directory, not updating i18n, ARRR"
165 echo "Arf, Arf, Arf, missing the timestamp ${TSTAMP} directory, not updating i18n, arf, arf, arf" | mail -s "Lisa, if you don't like your job you don't strike. You just go in every day and do it really half-assed. That's the American way." debian-l10n-devel@lists.alioth.debian.org
168 echo "ARRRRRRR, could not verify our timestamp signature, ARRR. Don't mess with our files, i18n guys, ARRRRR."
169 echo "Arf, Arf, Arf, could not verify our timestamp signature, arf. Don't mess with our files, i18n guys, arf, arf, arf" | mail -s "You can't keep blaming yourself. Just blame yourself once, and move on." debian-l10n-devel@lists.alioth.debian.org
173 # Process the accepted queue
174 function accepted() {
175 log "Processing queue/accepted"
176 rm -f "$accepted/REPORT"
177 dak process-accepted -pa -d "$accepted" > "$accepted/REPORT"
178 cat "$accepted/REPORT" | mail -s "Install for $(date +"%D - %R")" ftpmaster@ftp-master.debian.org
179 chgrp debadmin "$accepted/REPORT"
180 chmod 664 "$accepted/REPORT"
184 log "Checking for cruft in overrides"
189 log "Generating suite file lists for apt-ftparchive"
190 dak make-suite-file-list
193 function fingerprints() {
194 log "Updating fingerprints"
195 dak import-keyring -L /srv/keyring.debian.org/keyrings/debian-keyring.gpg
198 dak import-keyring --generate-users "%s" /srv/keyring.debian.org/keyrings/debian-maintainers.gpg >"${OUTFILE}"
200 if [ -s "${OUTFILE}" ]; then
201 /usr/sbin/sendmail -odq -oi -t -f envelope@ftp-master.debian.org <<EOF
202 From: Debian FTP Masters <ftpmaster@ftp-master.debian.org>
203 To: <debian-project@lists.debian.org>
204 Subject: Debian Maintainers Keyring changes
205 Content-Type: text/plain; charset=utf-8
208 The following changes to the debian-maintainers keyring have just been activated:
212 Debian distribution maintenance software,
213 on behalf of the Keyring maintainers
220 function overrides() {
221 log "Writing overrides into text files"
226 rm -f override.sid.all3
227 for i in main contrib non-free main.debian-installer; do cat override.sid.$i >> override.sid.all3; done
231 log "Generating package / file mapping"
232 dak make-pkg-file-mapping | bzip2 -9 > $base/ftp/indices/package-file.map.bz2
235 function packages() {
236 log "Generating Packages and Sources files"
238 GZIP='--rsyncable' ; export GZIP
239 apt-ftparchive generate apt.conf
243 log "Generating pdiff files"
244 dak generate-index-diffs
248 log "Generating Release files"
249 dak generate-releases
252 function dakcleanup() {
253 log "Cleanup old packages/files"
254 dak clean-suites -m 10000
259 # Needs to be rebuilt, as files have moved. Due to unaccepts, we need to
260 # update this before wanna-build is updated.
261 log "Regenerating wanna-build/buildd information"
262 psql projectb -A -t -q -c "SELECT filename FROM queue_build WHERE suite = 5 AND queue = 0 AND in_queue = true AND filename ~ 'd(sc|eb)$'" > $dbdir/dists/unstable_accepted.list
263 symlinks -d /srv/incoming.debian.org/buildd > /dev/null
264 apt-ftparchive generate apt.conf.buildd
267 function buildd_dir() {
268 # Rebuilt the buildd dir to avoid long times of 403
269 log "Regenerating the buildd incoming dir"
270 STAMP=$(date "+%Y%m%d%H%M")
279 log "Removing any core files ..."
280 find -type f -name core -print0 | xargs -0r rm -v
282 log "Checking permissions on files in the FTP tree ..."
283 find -type f \( \! -perm -444 -o -perm +002 \) -ls
284 find -type d \( \! -perm -555 -o -perm +002 \) -ls
286 log "Checking symlinks ..."
289 log "Creating recursive directory listing ... "
290 rm -f .${FILENAME}.new
291 TZ=UTC ls -lR > .${FILENAME}.new
293 if [ -r ${FILENAME}.gz ] ; then
294 mv -f ${FILENAME}.gz ${FILENAME}.old.gz
295 mv -f .${FILENAME}.new ${FILENAME}
296 rm -f ${FILENAME}.patch.gz
297 zcat ${FILENAME}.old.gz | diff -u - ${FILENAME} | gzip --rsyncable -9cfn - >${FILENAME}.patch.gz
298 rm -f ${FILENAME}.old.gz
300 mv -f .${FILENAME}.new ${FILENAME}
303 gzip --rsyncable -9cfN ${FILENAME} >${FILENAME}.gz
307 function mkmaintainers() {
308 log -n 'Creating Maintainers index ... '
311 dak make-maintainers ${scriptdir}/masterfiles/pseudo-packages.maintainers | \
312 sed -e "s/~[^ ]*\([ ]\)/\1/" | awk '{printf "%-20s ", $1; for (i=2; i<=NF; i++) printf "%s ", $i; printf "\n";}' > .new-maintainers
315 cmp .new-maintainers Maintainers >/dev/null
318 if [ $rc = 1 ] || [ ! -f Maintainers ] ; then
319 log -n "installing Maintainers ... "
320 mv -f .new-maintainers Maintainers
321 gzip --rsyncable -9v <Maintainers >.new-maintainers.gz
322 mv -f .new-maintainers.gz Maintainers.gz
323 elif [ $rc = 0 ] ; then
324 log '(same as before)'
325 rm -f .new-maintainers
332 function copyoverrides() {
333 log 'Copying override files into public view ...'
335 for f in $copyoverrides ; do
337 chmod g+w override.$f
341 pc="`gzip 2>&1 -9nv <$overridedir/override.$f >.newover-$f.gz`"
344 cmp -s .newover-$f.gz $nf
349 elif [ $rc = 1 -o ! -f $nf ]; then
350 echo " installing new $nf $pc"
351 mv -f .newover-$f.gz $nf
360 function mkfilesindices() {
362 cd $base/ftp/indices/files/components
366 echo "Querying projectb..."
367 echo 'SELECT l.path, f.filename, a.arch_string FROM location l JOIN files f ON (f.location = l.id) LEFT OUTER JOIN (binaries b JOIN architecture a ON (b.architecture = a.id)) ON (f.id = b.file)' | psql projectb -At | sed 's/|//;s,^/srv/ftp.debian.org/ftp,.,' | sort >$ARCHLIST
370 perl -ne 'print; while (m,/[^/]+$,) { $_=$`; print $_ . "\n" unless $d{$_}++; }'
373 perl -e '@nonpool=(); while (<>) { if (m,^\./pool/,) { print; } else { push @nonpool, $_; } } print for (@nonpool);'
376 echo "Generating sources list..."
378 sed -n 's/|$//p' $ARCHLIST
380 find ./dists -maxdepth 1 \! -type d
381 find ./dists \! -type d | grep "/source/"
382 ) | sort -u | gzip --rsyncable -9 > source.list.gz
384 echo "Generating arch lists..."
386 ARCHES=$( (<$ARCHLIST sed -n 's/^.*|//p'; echo amd64) | grep . | grep -v all | sort -u)
388 (sed -n "s/|$a$//p" $ARCHLIST
389 sed -n 's/|all$//p' $ARCHLIST
392 find ./dists -maxdepth 1 \! -type d
393 find ./dists \! -type d | grep -E "(proposed-updates.*_$a.changes$|/main/disks-$a/|/main/installer-$a/|/Contents-$a|/binary-$a/)"
394 ) | sort -u | gzip --rsyncable -9 > arch-$a.list.gz
397 echo "Generating suite lists..."
400 printf 'SELECT DISTINCT l.path, f.filename FROM (SELECT sa.source AS source FROM src_associations sa WHERE sa.suite = %d UNION SELECT b.source AS source FROM bin_associations ba JOIN binaries b ON (ba.bin = b.id) WHERE ba.suite = %d) s JOIN dsc_files df ON (s.source = df.source) JOIN files f ON (df.file = f.id) JOIN location l ON (f.location = l.id)\n' $1 $1 | psql -F' ' -A -t projectb
402 printf 'SELECT l.path, f.filename FROM bin_associations ba JOIN binaries b ON (ba.bin = b.id) JOIN files f ON (b.file = f.id) JOIN location l ON (f.location = l.id) WHERE ba.suite = %d\n' $1 | psql -F' ' -A -t projectb
405 printf 'SELECT id, suite_name FROM suite\n' | psql -F' ' -At projectb |
406 while read id suite; do
407 [ -e $base/ftp/dists/$suite ] || continue
410 distname=$(cd dists; readlink $suite || echo $suite)
411 find ./dists/$distname \! -type d
412 for distdir in ./dists/*; do
413 [ "$(readlink $distdir)" != "$distname" ] || echo $distdir
416 suite_list $id | tr -d ' ' | sed 's,^/srv/ftp.debian.org/ftp,.,'
417 ) | sort -u | gzip --rsyncable -9 > suite-${suite}.list.gz
420 echo "Finding everything on the ftp site to generate sundries $(date +"%X")..."
422 (cd $base/ftp; find . \! -type d \! -name 'Archive_Maintenance_In_Progress' | sort) >$ARCHLIST
425 zcat *.list.gz | cat - *.list | sort -u |
426 diff - $ARCHLIST | sed -n 's/^> //p' > sundries.list
428 echo "Generating files list $(date +"%X")..."
431 (echo ./project/trace; zcat arch-$a.list.gz source.list.gz) |
432 cat - sundries.list dists.list project.list docs.list indices.list |
433 sort -u | poolfirst > ../arch-$a.files
437 for dist in sid squeeze; do
438 find ./dists/$dist/main/i18n/ \! -type d | sort -u | gzip --rsyncable -9 > $base/ftp/indices/files/components/translation-$dist.list.gz
442 (cat ../arch-i386.files ../arch-amd64.files; zcat suite-oldstable.list.gz suite-proposed-updates.list.gz ; zcat translation-sid.list.gz ; zcat translation-squeeze.list.gz) |
443 sort -u | poolfirst > ../typical.files
449 function mkchecksums() {
450 dsynclist=$dbdir/dsync.list
451 md5list=$indices/md5sums
453 log -n "Creating md5 / dsync index file ... "
456 ${bindir}/dsync-flist -q generate $dsynclist --exclude $dsynclist --md5
457 ${bindir}/dsync-flist -q md5sums $dsynclist | gzip -9n --rsyncable > ${md5list}.gz
458 ${bindir}/dsync-flist -q link-dups $dsynclist || true
462 log "Running various scripts from $scriptsdir"
472 echo "Regenerating \"public\" mirror/ hardlink fun"
474 rsync -aH --link-dest ${ftpdir} --delete --delete-after --ignore-errors ${ftpdir}/. .
478 log "Trigger daily wanna-build run"
479 ssh -o BatchMode=yes -o SetupTimeOut=90 -o ConnectTimeout=90 wbadm@buildd /org/wanna-build/trigger.daily || echo "W-B trigger.daily failed" | mail -s "W-B Daily trigger failed" ftpmaster@ftp-master.debian.org
483 log "Expiring old database dumps..."
485 $scriptsdir/expire_dumps -d . -p -f "dump_*"
488 function transitionsclean() {
489 log "Removing out of date transitions..."
491 dak transitions -c -a
495 # Send a report on NEW/BYHAND packages
496 log "Nagging ftpteam about NEW/BYHAND packages"
497 dak queue-report | mail -e -s "NEW and BYHAND on $(date +%D)" ftpmaster@ftp-master.debian.org
498 # and one on crufty packages
499 log "Sending information about crufty packages"
500 dak cruft-report > $webdir/cruft-report-daily.txt
501 dak cruft-report -s experimental >> $webdir/cruft-report-daily.txt
502 cat $webdir/cruft-report-daily.txt | mail -e -s "Debian archive cruft report for $(date +%D)" ftpmaster@ftp-master.debian.org
506 log "Updating DM html page"
507 $scriptsdir/dm-monitor >$webdir/dm-uploaders.html
511 log "Categorizing uncategorized bugs filed against ftp.debian.org"
516 # Push dak@merkel so it syncs the projectb there. Returns immediately, the sync runs detached
517 log "Trigger merkel/flotows projectb sync"
518 ssh -2 -o BatchMode=yes -o SetupTimeOut=30 -o ConnectTimeout=30 -i ~/.ssh/push_merkel_projectb dak@merkel.debian.org sleep 1
519 # Also trigger flotow, the ftpmaster test box
520 ssh -2 -o BatchMode=yes -o SetupTimeOut=30 -o ConnectTimeout=30 -i ~/.ssh/push_flotow_projectb dak@flotow.debconf.org sleep 1
524 # Push dak@merkel to tell it to sync the dd accessible parts. Returns immediately, the sync runs detached
525 log "Trigger merkels dd accessible parts sync"
526 ssh -2 -o BatchMode=yes -o SetupTimeOut=30 -o ConnectTimeout=30 -i ~/.ssh/push_merkel_ddaccess dak@merkel.debian.org sleep 1
529 function mirrorpush() {
530 log "Starting the mirrorpush"
531 date -u > /srv/ftp.debian.org/web/mirrorstart
532 echo "Using dak v1" >> /srv/ftp.debian.org/web/mirrorstart
533 echo "Running on host $(hostname -f)" >> /srv/ftp.debian.org/web/mirrorstart
534 sudo -H -u archvsync /home/archvsync/runmirrors > ~dak/runmirrors.log 2>&1 &
538 log "Exporting package data foo for i18n project"
539 STAMP=$(date "+%Y%m%d%H%M")
540 mkdir -p ${scriptdir}/i18n/${STAMP}
541 cd ${scriptdir}/i18n/${STAMP}
542 dak control-suite -l stable > lenny
543 dak control-suite -l testing > squeeze
544 dak control-suite -l unstable > sid
545 echo "${STAMP}" > timestamp
546 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
550 ln -sfT ${scriptdir}/i18n/${STAMP} i18n
553 find ./i18n -mindepth 1 -maxdepth 1 -mtime +2 -not -name "${STAMP}" -type d -print0 | xargs --no-run-if-empty -0 rm -rf
557 log "Updating stats data"
559 $scriptsdir/update-ftpstats $base/log/* > $base/misc/ftpstats.data
560 R --slave --vanilla < $base/misc/ftpstats.R
561 dak stats arch-space > $webdir/arch-space
562 dak stats pkg-nums > $webdir/pkg-nums
565 function aptftpcleanup() {
566 log "Clean up apt-ftparchive's databases"
568 apt-ftparchive -q clean apt.conf
571 function compress() {
572 log "Compress old psql backups"
574 find -maxdepth 1 -mindepth 1 -type f -name 'dump_pre_*' -mtime +2 -print0 | xargs -0 --no-run-if-empty rm
576 find -maxdepth 1 -mindepth 1 -type f -name 'dump_*' \! -name '*.bz2' \! -name '*.gz' -mmin +720 |
577 while read dumpname; do
578 echo "Compressing $dumpname"
579 bzip2 -9fv "$dumpname"
581 find -maxdepth 1 -mindepth 1 -type f -name "dumpall_*" \! -name '*.bz2' \! -name '*.gz' -mmin +720 |
582 while read dumpname; do
583 echo "Compressing $dumpname"
584 bzip2 -9fv "$dumpname"
586 finddup -l -d $base/backup
589 function logstats() {
590 $masterdir/tools/logs.py "$1"
593 # save timestamp when we start
594 function savetimestamp() {
595 NOW=`date "+%Y.%m.%d-%H:%M:%S"`
596 echo ${NOW} > "${dbdir}/dinstallstart"
599 function maillogfile() {
600 cat "$LOGFILE" | mail -s "Log for dinstall run of ${NOW}" cron@ftp-master.debian.org
603 function renamelogfile() {
604 if [ -f "${dbdir}/dinstallstart" ]; then
605 NOW=$(cat "${dbdir}/dinstallstart")
607 mv "$LOGFILE" "$logdir/dinstall_${NOW}.log"
608 logstats "$logdir/dinstall_${NOW}.log"
609 bzip2 -9 "$logdir/dinstall_${NOW}.log"
611 error "Problem, I don't know when dinstall started, unable to do log statistics."
612 NOW=`date "+%Y.%m.%d-%H:%M:%S"`
614 mv "$LOGFILE" "$logdir/dinstall_${NOW}.log"
615 bzip2 -9 "$logdir/dinstall_${NOW}.log"
619 function testingsourcelist() {
620 dak ls -s testing -f heidi -r .| egrep 'source$' > ${webdir}/testing.list
623 # do a last run of process-unchecked before dinstall is on.
624 function process_unchecked() {
625 log "Processing the unchecked queue"
627 UNCHECKED_WITHOUT_LOCK="-p"
632 ########################################################################
633 ########################################################################
635 # Function to save which stage we are in, so we can restart an interrupted
636 # dinstall. Or even run actions in parallel, if we dare to, by simply
637 # backgrounding the call to this function. But that should only really be
638 # done for things we don't care much about.
640 # This should be called with the first argument being an array, with the
642 # - FUNC - the function name to call
643 # - ARGS - Possible arguments to hand to the function. Can be the empty string
644 # - TIME - The timestamp name. Can be the empty string
645 # - ERR - if this is the string false, then the call will be surrounded by
646 # set +e ... set -e calls, so errors in the function do not exit
647 # dinstall. Can be the empty string, meaning true.
649 # MAKE SURE TO KEEP THIS THE LAST FUNCTION, AFTER ALL THE VARIOUS ONES
650 # ADDED FOR DINSTALL FEATURES!
657 STAGEFILE="${stagedir}/${FUNC}"
658 if [ -f "${STAGEFILE}" ]; then
659 stamptime=$(/usr/bin/stat -c %Z "${STAGEFILE}")
661 difference=$(( $unixtime - $stamptime ))
662 if [ ${difference} -ge 14400 ]; then
663 log_error "Did already run ${FUNC}, stagefile exists, but that was ${difference} seconds ago. Please check."
665 log "Did already run ${FUNC}, not calling again..."
670 debug "Now calling function ${FUNC}. Arguments: ${ARGS}. Timestamp: ${TIME}"
672 # Make sure we are always at the same place. If a function wants to be elsewhere,
673 # it has to cd first!
676 # Now redirect the output into $STAGEFILE.log. In case it errors out somewhere our
677 # errorhandler trap can then mail the contents of $STAGEFILE.log only, instead of a whole
678 # dinstall logfile. Short error mails ftw!
679 exec >> "${STAGEFILE}.log" 2>&1
681 if [ -f "${LOCK_STOP}" ]; then
682 log "${LOCK_STOP} exists, exiting immediately"
686 if [ "${error}" = "false" ]; then
691 # No matter what happened in the function, we make sure we have set -e default state back
694 # Make sure we are always at the same place.
697 # We always use the same umask. If a function wants to do different, fine, but we reset.
702 if [ -n "${TIME}" ]; then
706 # And the output goes back to the normal logfile
707 exec >> "$LOGFILE" 2>&1
709 # Now we should make sure that we have a usable dinstall.log, so append the $STAGEFILE.log
711 cat "${STAGEFILE}.log" >> "${LOGFILE}"
712 rm -f "${STAGEFILE}.log"
714 if [ -f "${LOCK_STOP}" ]; then
715 log "${LOCK_STOP} exists, exiting immediately"
720 ########################################################################
723 LOGFILE="$logdir/dinstall.log"
725 exec >> "$LOGFILE" 2>&1
727 # usually we are not using debug logs. Set to 1 if you want them.
733 # where do we want mails to go? For example log entries made with error()
734 if [ "x$(hostname -s)x" != "xriesx" ]; then
735 # Not our ftpmaster host
736 MAILTO=${MAILTO:-"root"}
739 MAILTO=${MAILTO:-"ftpmaster@debian.org"}
742 # Make sure we start out with a sane umask setting
745 # And use one locale, no matter what the caller has set
749 # How many logfiles to keep
750 LOGROTATE=${LOGROTATE:-400}
752 # Marker for dinstall start
753 DINSTALLSTART="${lockdir}/dinstallstart"
754 # Marker for dinstall end
755 DINSTALLEND="${lockdir}/dinstallend"
757 touch "${DINSTALLSTART}"
760 # lock cron.unchecked (it immediately exits when this exists)
761 LOCK_DAILY="$lockdir/daily.lock"
763 # Lock cron.unchecked from doing work
764 LOCK_ACCEPTED="$lockdir/unchecked.lock"
766 # Lock process-new from doing work
767 LOCK_NEW="$lockdir/processnew.lock"
769 # This file is simply used to indicate to britney whether or not
770 # the Packages file updates completed sucessfully. It's not a lock
771 # from our point of view
772 LOCK_BRITNEY="$lockdir/britney.lock"
774 # If this file exists we exit immediately after the currently running
776 LOCK_STOP="$lockdir/archive.stop"
778 lockfile -l 3600 "${LOCK_DAILY}"
780 trap cleanup EXIT TERM HUP INT QUIT
782 touch "${LOCK_BRITNEY}"
818 TIME="External Updates"
848 lockfile "$LOCK_ACCEPTED"
852 FUNC="process_unchecked"
884 rm -f "$LOCK_ACCEPTED"
889 TIME="make-suite-file-list"
897 TIME="import-keyring"
913 TIME="pkg-file-mapping"
921 TIME="apt-ftparchive"
969 TIME="mirror hardlinks"
983 rm -f "${LOCK_DAILY}"
985 ts "locked part finished"
1004 FUNC="transitionsclean"
1005 TIME="transitionsclean"
1037 TIME="merkel projectb push"
1068 FUNC="testingsourcelist"
1075 rm -f ${LOCK_BRITNEY}
1087 TIME="merkel ddaccessible sync"
1102 FUNC="aptftpcleanup"
1103 TIME="apt-ftparchive cleanup"
1109 log "Daily cron scripts successful, all done"
1111 exec > "$logdir/afterdinstall.log" 2>&1
1114 FUNC="renamelogfile"
1122 # Now, at the very (successful) end of dinstall, make sure we remove
1123 # our stage files, so the next dinstall run will do it all again.
1125 touch "${DINSTALLEND}"