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