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