]> git.decadent.org.uk Git - dak.git/blob - config/debian/cron.dinstall
dinstall
[dak.git] / config / debian / cron.dinstall
1 #!/bin/bash
2 # No way I try to deal with a crippled sh just for POSIX foo.
3
4 # Copyright (C) 2009 Joerg Jaspert <joerg@debian.org>
5 #
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.
9 #
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.
14 #
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.
18
19 # exit on errors
20 set -e
21 # make sure to only use defined variables
22 set -u
23
24 # import the general variable set.
25 export SCRIPTVARS=/srv/ftp.debian.org/dak/config/debian/vars
26 . $SCRIPTVARS
27
28 ########################################################################
29 # Functions                                                            #
30 ########################################################################
31 # common functions are "outsourced"
32 . "${configdir}/common"
33
34 # Timestamp. Used for dinstall stat graphs
35 function ts() {
36         TS=$(($TS+1));
37         echo "Archive maintenance timestamp $TS ($1): $(date +%H:%M:%S)"
38 }
39
40 # Cleanup actions
41 function cleanup() {
42         rm -f ${LOCK_DAILY}
43         rm -f ${LOCK_ACCEPTED}
44 }
45
46 ########################################################################
47 # the actual dinstall functions follow                                 #
48 ########################################################################
49
50 # Setup the notice file to tell bad mirrors they used the wrong time
51 function notice() {
52     rm -f "$NOTICE"
53     cat > "$NOTICE" <<EOF
54 Packages are currently being installed and indices rebuilt.
55 Maintenance is automatic, starting at 01|07|13|19:52 UTC,
56 and ending about an hour later.  This file is then removed.
57
58 You should not mirror the archive during this period.
59 EOF
60 }
61
62 # pushing merkels QA user, part one
63 function merkel1() {
64     log "Telling merkels QA user that we start dinstall"
65     ssh -2 -i ~dak/.ssh/push_merkel_qa  -o BatchMode=yes -o SetupTimeOut=90 -o ConnectTimeout=90 qa@merkel.debian.org sleep 1
66 }
67
68 # Create the postgres dump files
69 function pgdump_pre() {
70     log "Creating pre-daily-cron-job backup of projectb database..."
71     pg_dump projectb > $base/backup/dump_$(date +%Y.%m.%d-%H:%M:%S)
72 }
73
74 function pgdump_post() {
75     log "Creating post-daily-cron-job backup of projectb database..."
76     cd $base/backup
77     POSTDUMP=$(date +%Y.%m.%d-%H:%M:%S)
78     pg_dump projectb > $base/backup/dump_$POSTDUMP
79     pg_dumpall --globals-only > $base/backup/dumpall_$POSTDUMP
80     ln -sf $base/backup/dump_$POSTDUMP current
81     ln -sf $base/backup/dumpall_$POSTDUMP currentall
82 }
83
84 # Load the dak-dev projectb
85 function pgdakdev() {
86     cd $base/backup
87     echo "drop database projectb" | psql -p 5433 template1
88         cat currentall | psql -p 5433 template1
89     createdb -p 5433 -T template0 projectb
90     fgrep -v '\connect' current | psql -p 5433 projectb
91 }
92
93 # Updating various files
94 function updates() {
95     log "Updating Bugs docu, Mirror list and mailing-lists.txt"
96     cd $configdir
97     $scriptsdir/update-bugdoctxt
98     $scriptsdir/update-mirrorlists
99     $scriptsdir/update-mailingliststxt
100     $scriptsdir/update-pseudopackages.sh
101 }
102
103 # Process (oldstable)-proposed-updates "NEW" queue
104 function punew_do() {
105     cd "${queuedir}/${1}"
106     date -u -R >> REPORT
107     dak process-new -a -C COMMENTS >> REPORT || true
108     echo >> REPORT
109 }
110 function punew() {
111     log "Doing automated p-u-new processing"
112     punew_do "$1"
113 }
114 function opunew() {
115     log "Doing automated o-p-u-new processing"
116     punew_do "$1"
117 }
118
119 # The first i18n one, syncing new descriptions
120 function i18n1() {
121     log "Synchronizing i18n package descriptions"
122     # First sync their newest data
123     cd ${scriptdir}/i18nsync
124     rsync -aq --delete --delete-after ddtp-sync:/does/not/matter . || true
125
126     # Now check if we still know about the packages for which they created the files
127     # is the timestamp signed by us?
128     if $(gpgv --keyring /srv/ftp.debian.org/s3kr1t/dot-gnupg/pubring.gpg timestamp.gpg timestamp); then
129         # now read it. As its signed by us we are sure the content is what we expect, no need
130         # to do more here. And we only test -d a directory on it anyway.
131         TSTAMP=$(cat timestamp)
132         # do we have the dir still?
133         if [ -d ${scriptdir}/i18n/${TSTAMP} ]; then
134             # Lets check!
135             if ${scriptsdir}/ddtp-i18n-check.sh . ${scriptdir}/i18n/${TSTAMP}; then
136                 # Yay, worked, lets copy around
137                 for dir in squeeze sid; do
138                     if [ -d dists/${dir}/ ]; then
139                         cd dists/${dir}/main/i18n
140                         rsync -aq --delete --delete-after  . ${ftpdir}/dists/${dir}/main/i18n/.
141                     fi
142                     cd ${scriptdir}/i18nsync
143                 done
144             else
145                 echo "ARRRR, bad guys, wrong files, ARRR"
146                 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
147             fi
148         else
149             echo "ARRRR, missing the timestamp ${TSTAMP} directory, not updating i18n, ARRR"
150             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
151         fi
152     else
153         echo "ARRRRRRR, could not verify our timestamp signature, ARRR. Don't mess with our files, i18n guys, ARRRRR."
154         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
155     fi
156 }
157
158 # Process the accepted queue
159 function accepted() {
160     log "Processing queue/accepted"
161     rm -f "$accepted/REPORT"
162     dak process-accepted -pa -d "$accepted" > "$accepted/REPORT"
163     cat "$accepted/REPORT" | mail -s "Install for $(date +"%D - %R")" ftpmaster@ftp-master.debian.org
164     chgrp debadmin "$accepted/REPORT"
165     chmod 664 "$accepted/REPORT"
166 }
167
168 function cruft() {
169     log "Checking for cruft in overrides"
170     dak check-overrides
171
172     log "Fixing symlinks in $ftpdir"
173     symlinks -d -r $ftpdir
174 }
175
176 function msfl() {
177     log "Generating suite file lists for apt-ftparchive"
178     dak make-suite-file-list
179 }
180
181 function fingerprints() {
182     log "Updating fingerprints"
183     dak import-keyring -L /srv/keyring.debian.org/keyrings/debian-keyring.gpg
184 }
185
186 function overrides() {
187     log "Writing overrides into text files"
188     cd $overridedir
189     dak make-overrides
190
191     # FIXME
192     rm -f override.sid.all3
193     for i in main contrib non-free main.debian-installer; do cat override.sid.$i >> override.sid.all3; done
194 }
195
196 function mpfm() {
197     log "Generating package / file mapping"
198     dak make-pkg-file-mapping | bzip2 -9 > $base/ftp/indices/package-file.map.bz2
199 }
200
201 function packages() {
202     log "Generating Packages and Sources files"
203     cd $configdir
204     apt-ftparchive generate apt.conf
205 }
206
207 function pdiff() {
208     log "Generating pdiff files"
209     dak generate-index-diffs
210 }
211
212 function release() {
213     log "Generating Release files"
214     dak generate-releases
215 }
216
217 function dakcleanup() {
218     log "Cleanup old packages/files"
219     dak clean-suites
220     dak clean-queues
221 }
222
223 function buildd() {
224     # Needs to be rebuilt, as files have moved.  Due to unaccepts, we need to
225     # update this before wanna-build is updated.
226     log "Regenerating wanna-build/buildd information"
227     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
228     symlinks -d /srv/incoming.debian.org/buildd > /dev/null
229     apt-ftparchive generate apt.conf.buildd
230 }
231
232 function scripts() {
233     log "Running various scripts from $scriptsdir"
234     cd $scriptsdir
235     ./mkmaintainers
236     ./copyoverrides
237     ./mklslar
238     ./mkfilesindices
239     ./mkchecksums
240 }
241
242 function mirror() {
243     echo "Regenerating \"public\" mirror/ hardlink fun"
244     cd ${mirrordir}
245     rsync -aH --link-dest ${ftpdir} --delete --delete-after --ignore-errors ${ftpdir}/. .
246 }
247
248 function wb() {
249     log "Trigger daily wanna-build run"
250     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
251 }
252
253 function expire() {
254     log "Expiring old database dumps..."
255     cd $base/backup
256     $scriptsdir/expire_dumps -d . -p -f "dump_*"
257 }
258
259 function reports() {
260     # Send a report on NEW/BYHAND packages
261     log "Nagging ftpteam about NEW/BYHAND packages"
262     dak queue-report | mail -e -s "NEW and BYHAND on $(date +%D)" ftpmaster@ftp-master.debian.org
263     # and one on crufty packages
264     log "Sending information about crufty packages"
265     dak cruft-report > $webdir/cruft-report-daily.txt
266     dak cruft-report -s experimental >> $webdir/cruft-report-daily.txt
267     cat $webdir/cruft-report-daily.txt | mail -e -s "Debian archive cruft report for $(date +%D)" ftpmaster@ftp-master.debian.org
268 }
269
270 function dm() {
271     log "Updating DM html page"
272     $scriptsdir/dm-monitor >$webdir/dm-uploaders.html
273 }
274
275 function bts() {
276     log "Categorizing uncategorized bugs filed against ftp.debian.org"
277     dak bts-categorize
278 }
279
280 function merkel2() {
281     # Push katie@merkel so it syncs the projectb there. Returns immediately, the sync runs detached
282     log "Trigger merkels projectb sync"
283     ssh -2 -o BatchMode=yes -o SetupTimeOut=30 -o ConnectTimeout=30 -i ~/.ssh/push_merkel_projectb katie@merkel.debian.org sleep 1
284 }
285
286 function runparts() {
287     log "Using run-parts to run scripts in $base/scripts/distmnt"
288     run-parts --report $base/scripts/distmnt
289 }
290
291 function i18n2() {
292     log "Exporting package data foo for i18n project"
293     STAMP=$(date "+%Y%m%d%H%M")
294     mkdir -p ${scriptdir}/i18n/${STAMP}
295     cd ${scriptdir}/i18n/${STAMP}
296     dak control-suite -l stable > lenny
297     dak control-suite -l testing > squeeze
298     dak control-suite -l unstable > sid
299     echo "${STAMP}" > timestamp
300     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
301     rm -f md5sum
302     md5sum * > md5sum
303     cd ${webdir}/
304     ln -sfT ${scriptdir}/i18n/${STAMP} i18n
305
306     cd ${scriptdir}
307     find ./i18n -mindepth 1 -maxdepth 1 -mtime +2 -not -name "${STAMP}" -type d -print0 | xargs --no-run-if-empty -0 rm -rf
308 }
309
310 function stats() {
311     log "Updating stats data"
312     cd $configdir
313     $scriptsdir/update-ftpstats $base/log/* > $base/misc/ftpstats.data
314     R --slave --vanilla < $base/misc/ftpstats.R
315 }
316
317 function aptftpcleanup() {
318     log "Clean up apt-ftparchive's databases"
319     cd $configdir
320     apt-ftparchive -q clean apt.conf
321 }
322
323 function compress() {
324     log "Compress old psql backups"
325     cd $base/backup/
326     find -maxdepth 1 -mindepth 1 -type f -name 'dump_*' \! -name '*.bz2' \! -name '*.gz' -mtime +1 |
327     while read dumpname; do
328         echo "Compressing $dumpname"
329         bzip2 -9v "$dumpname"
330     done
331 }
332
333 function logstats() {
334     $masterdir/tools/logs.py "$1"
335 }
336
337 # save timestamp when we start
338 function savetimestamp() {
339         NOW=`date "+%Y.%m.%d-%H:%M:%S"`
340         echo ${NOW} > "${dbdir}/dinstallstart"
341 }
342
343 function maillogfile() {
344     cat "$LOGFILE" | mail -s "Log for dinstall run of ${NOW}" cron@ftp-master.debian.org
345 }
346
347 function renamelogfile() {
348         if [ -f "${dbdir}/dinstallstart" ]; then
349                 RENAMETO=$(cat "${dbdir}/dinstallstart")
350                 mv "$LOGFILE" "$logdir/dinstall_${RENAMETO}.log"
351                 logstats "$logdir/dinstall_${RENAMETO}.log"
352                 bzip2 -9 "$logdir/dinstall_${RENAMETO}.log"
353         else
354                 error "Problem, I don't know when dinstall started, unable to do log statistics."
355                 NOW=`date "+%Y.%m.%d-%H:%M:%S"`
356                 mv "$LOGFILE" "$logdir/dinstall_${NOW}.log"
357                 bzip2 -9 "$logdir/dinstall_${NOW}.log"
358         fi
359 }
360
361 function testingsourcelist() {
362     dak ls -s testing -f heidi -r .| egrep 'source$' > ${webdir}/testing.list
363 }
364 ########################################################################
365 ########################################################################
366
367 # Function to save which stage we are in, so we can restart an interrupted
368 # dinstall. Or even run actions in parallel, if we dare to, by simply
369 # backgrounding the call to this function. But that should only really be
370 # done for things we dont care much about.
371 #
372 # This should be called with the first argument being an array, with the
373 # members
374 #  - FUNC - the function name to call
375 #  - ARGS - Possible arguments to hand to the function. Can be the empty string
376 #  - TS   - The timestamp name. Can be the empty string
377 #  - ERR  - if this is the string false, then the call will be surrounded by
378 #           set +e ... set -e calls, so errors in the function do not exit
379 #           dinstall. Can be the empty string, meaning true.
380 #
381 # MAKE SURE TO KEEP THIS THE LAST FUNCTION, AFTER ALL THE VARIOUS ONES
382 # ADDED FOR DINSTALL FEATURES!
383 function stage() {
384     ARGS='GO[@]'
385     local "${!ARGS}"
386
387     if [ -f "${stagedir}/${FUNC}" ]; then
388         stamptime=$(/usr/bin/stat -c %Z "${stagedir}/${FUNC}")
389         unixtime=$(date +%s)
390         difference=$(( $unixtime - $stamptime ))
391         if [ ${difference} -ge 14400 ]; then
392             log_error "Did already run ${FUNC}, stagefile exists, but that was ${difference} seconds ago. Please check."
393         else
394             log "Did already run ${FUNC}, not calling again..."
395         fi
396         return
397     fi
398
399     debug "Now calling function ${FUNC}. Arguments: ${ARGS}. Timestamp: ${TS}"
400
401     # Make sure we are always at the same place. If a function wants to be elsewhere,
402     # it has to cd first!
403     cd ${configdir}
404
405         if [ -f "${LOCK_STOP}" ]; then
406                 log "${LOCK_STOP} exists, exiting immediately"
407                 exit 42
408         fi
409
410     if [ "${ERR}" = "false" ]; then
411         set +e
412     fi
413     ${FUNC} ${ARGS}
414
415     # No matter what happened in the function, we make sure we have set -e default state back
416     set -e
417
418     # Make sure we are always at the same place.
419     cd ${configdir}
420
421     touch "${stagedir}/${FUNC}"
422
423     if [ -n "${TIME}" ]; then
424         ts "${TIME}"
425     fi
426
427         if [ -f "${LOCK_STOP}" ]; then
428                 log "${LOCK_STOP} exists, exiting immediately"
429                 exit 42
430         fi
431 }
432
433 ########################################################################
434
435 # We need logs.
436 LOGFILE="$logdir/dinstall.log"
437
438 exec >> "$LOGFILE" 2>&1
439
440 # usually we are not using debug logs. Set to 1 if you want them.
441 DEBUG=0
442
443 # our name
444 PROGRAM="dinstall"
445
446 # where do we want mails to go? For example log entries made with error()
447 if [ "x$(hostname -s)x" != "xriesx" ]; then
448     # Not our ftpmaster host
449     MAILTO=${MAILTO:-"root"}
450 else
451     # Yay, ftpmaster
452     MAILTO=${MAILTO:-"ftpmaster@debian.org"}
453 fi
454
455 # How many logfiles to keep
456 LOGROTATE=${LOGROTATE:-400}
457
458 # Marker for dinstall start
459 DINSTALLSTART="${lockdir}/dinstallstart"
460 # Marker for dinstall end
461 DINSTALLEND="${lockdir}/dinstallend"
462
463 # Timestamps start at -1. so first gets 0
464 TS=-1
465 touch "${DINSTALLSTART}"
466 ts "startup"
467
468 # Tell everyone we are doing some work
469 NOTICE="$ftpdir/Archive_Maintenance_In_Progress"
470
471 # lock cron.unchecked (it immediately exits when this exists)
472 LOCK_DAILY="$lockdir/daily.lock"
473
474 # Lock process-new and cron.unchecked from doing work
475 LOCK_ACCEPTED="$lockdir/unchecked.lock"
476
477 # This file is simply used to indicate to britney whether or not
478 # the Packages file updates completed sucessfully.  It's not a lock
479 # from our point of view
480 LOCK_BRITNEY="$lockdir/britney.lock"
481
482 # If this file exists we exit immediately after the currently running
483 # function is done
484 LOCK_STOP="$lockdir/archive.stop"
485
486 lockfile -l 3600 "${LOCK_DAILY}"
487 trap cleanup EXIT ERR TERM HUP INT QUIT
488
489 touch "${LOCK_BRITNEY}"
490
491 GO=(
492     FUNC="savetimestamp"
493     TIME=""
494     ARGS=""
495     ERR="false"
496 )
497 stage $GO
498
499 GO=(
500     FUNC="notice"
501     TIME=""
502     ARGS=""
503     ERR="false"
504 )
505 stage $GO
506
507 GO=(
508     FUNC="merkel1"
509     TIME="init"
510     ARGS=""
511     ERR="false"
512 )
513 stage $GO
514
515 GO=(
516     FUNC="pgdump_pre"
517     TIME="pg_dump1"
518     ARGS=""
519     ERR=""
520 )
521 stage $GO
522
523 GO=(
524     FUNC="updates"
525     TIME="External Updates"
526     ARGS=""
527     ERR="false"
528 )
529 stage $GO
530
531 GO=(
532     FUNC="punew"
533     TIME="p-u-new"
534     ARGS="p-u-new"
535     ERR=""
536 )
537 stage $GO
538
539 GO=(
540     FUNC="opunew"
541     TIME="o-p-u-new"
542     ARGS="o-p-u-new"
543     ERR=""
544 )
545 stage $GO
546
547 GO=(
548     FUNC="i18n1"
549     TIME="i18n 1"
550     ARGS=""
551     ERR="false"
552 )
553 stage $GO
554
555 lockfile "$LOCK_ACCEPTED"
556
557 GO=(
558     FUNC="accepted"
559     TIME="accepted"
560     ARGS=""
561     ERR=""
562 )
563 stage $GO
564
565 GO=(
566     FUNC="cruft"
567     TIME="cruft"
568     ARGS=""
569     ERR=""
570 )
571 stage $GO
572
573 rm -f "$LOCK_ACCEPTED"
574
575 GO=(
576     FUNC="msfl"
577     TIME="make-suite-file-list"
578     ARGS=""
579     ERR=""
580 )
581 stage $GO
582
583 GO=(
584     FUNC="fingerprints"
585     TIME="import-keyring"
586     ARGS=""
587     ERR="false"
588 )
589 stage $GO
590
591 GO=(
592     FUNC="overrides"
593     TIME="overrides"
594     ARGS=""
595     ERR=""
596 )
597 stage $GO
598
599 GO=(
600     FUNC="mpfm"
601     TIME="pkg-file-mapping"
602     ARGS=""
603     ERR="false"
604 )
605 stage $GO
606
607 GO=(
608     FUNC="packages"
609     TIME="apt-ftparchive"
610     ARGS=""
611     ERR=""
612 )
613 stage $GO
614
615 GO=(
616     FUNC="pdiff"
617     TIME="pdiff"
618     ARGS=""
619     ERR=""
620 )
621 stage $GO
622
623 GO=(
624     FUNC="release"
625     TIME="release files"
626     ARGS=""
627     ERR=""
628 )
629 stage $GO
630
631 GO=(
632     FUNC="dakcleanup"
633     TIME="cleanup"
634     ARGS=""
635     ERR=""
636 )
637 stage $GO
638
639 GO=(
640     FUNC="buildd"
641     TIME="buildd"
642     ARGS=""
643     ERR=""
644 )
645 stage $GO
646
647 GO=(
648     FUNC="scripts"
649     TIME="scripts"
650     ARGS=""
651     ERR=""
652 )
653 stage $GO
654
655 GO=(
656     FUNC="mirror"
657     TIME="mirror hardlinks"
658     ARGS=""
659     ERR=""
660 )
661 stage $GO
662
663 GO=(
664     FUNC="wb"
665     TIME="w-b"
666     ARGS=""
667     ERR=""
668 )
669 stage $GO
670
671 rm -f "${NOTICE}"
672 rm -f "${LOCK_DAILY}"
673
674 ts "locked part finished"
675
676 GO=(
677     FUNC="pgdump_post"
678     TIME="pg_dump2"
679     ARGS=""
680     ERR=""
681 )
682 stage $GO
683
684 GO=(
685         FUNC="pgdakdev"
686         TIME="dak-dev db"
687         ARGS=""
688         ERR="false"
689 )
690 stage $GO
691
692 GO=(
693     FUNC="expire"
694     TIME="expire_dumps"
695     ARGS=""
696     ERR=""
697 )
698 stage $GO
699
700 GO=(
701     FUNC="reports"
702     TIME="reports"
703     ARGS=""
704     ERR=""
705 )
706 stage $GO
707
708 GO=(
709     FUNC="dm"
710     TIME=""
711     ARGS=""
712     ERR=""
713 )
714 stage $GO
715
716 GO=(
717     FUNC="bts"
718     TIME=""
719     ARGS=""
720     ERR="false"
721 )
722 stage $GO
723
724 GO=(
725     FUNC="merkel2"
726     TIME="merkel projectb push"
727     ARGS=""
728     ERR="false"
729 )
730 stage $GO
731
732 ulimit -m 90000 -d 90000 -s 10000 -v 200000
733
734 GO=(
735     FUNC="runparts"
736     TIME="run-parts"
737     ARGS=""
738     ERR="false"
739 )
740 stage $GO
741
742 GO=(
743     FUNC="i18n2"
744     TIME="i18n 2"
745     ARGS=""
746     ERR="false"
747 )
748 stage $GO
749
750 GO=(
751     FUNC="stats"
752     TIME="stats"
753     ARGS=""
754     ERR="false"
755 )
756 stage $GO
757
758 GO=(
759     FUNC="testingsourcelist"
760     TIME=""
761     ARGS=""
762     ERR="false"
763 )
764
765 rm -f ${LOCK_BRITNEY}
766
767 GO=(
768     FUNC="aptftpcleanup"
769     TIME="apt-ftparchive cleanup"
770     ARGS=""
771     ERR=""
772 )
773 stage $GO
774
775 GO=(
776     FUNC="compress"
777     TIME="compress"
778     ARGS=""
779     ERR=""
780 )
781 stage $GO
782
783 log "Daily cron scripts successful, all done"
784
785 exec > "$logdir/afterdinstall.log" 2>&1
786
787 cat "$LOGFILE" | mail -s "Log for dinstall run of ${NOW}" cron@ftp-master.debian.org
788
789 GO=(
790     FUNC="renamelogfile"
791     TIME=""
792     ARGS=""
793     ERR="false"
794 )
795 stage $GO
796
797
798 # Now, at the very (successful) end of dinstall, make sure we remove
799 # our stage files, so the next dinstall run will do it all again.
800 rm -f ${stagedir}/*
801 touch "${DINSTALLEND}"