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