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