]> git.decadent.org.uk Git - dak.git/blob - config/debian/cron.dinstall
dinstall
[dak.git] / config / debian / cron.dinstall
1 #!/bin/bash
2 # No way I try to deal with a crippled sh just for POSIX foo.
3
4 # Copyright (C) 2009 Joerg Jaspert <joerg@debian.org>
5 #
6 # This program is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU General Public License as
8 # published by the Free Software Foundation; version 2.
9 #
10 # This program is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 # General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18
19 # exit on errors
20 set -e
21 # make sure to only use defined variables
22 set -u
23
24 # import the general variable set.
25 export SCRIPTVARS=/srv/ftp.debian.org/dak/config/debian/vars
26 . $SCRIPTVARS
27
28 ########################################################################
29 # Functions                                                            #
30 ########################################################################
31 # common functions are "outsourced"
32 . "${configdir}/common"
33
34 # Timestamp. Used for dinstall stat graphs
35 function ts() {
36         TS=$(($TS+1));
37         echo "Archive maintenance timestamp $TS ($1): $(date +%H:%M:%S)"
38 }
39
40 # Cleanup actions
41 function cleanup() {
42         rm -f ${LOCK_DAILY}
43         rm -f ${LOCK_ACCEPTED}
44 }
45
46 # 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 scripts() {
239     log "Running various scripts from $scriptsdir"
240     cd $scriptsdir
241     ./mkmaintainers
242     ./copyoverrides
243     ./mklslar
244     ./mkfilesindices
245     ./mkchecksums
246 }
247
248 function mirror() {
249     echo "Regenerating \"public\" mirror/ hardlink fun"
250     cd ${mirrordir}
251     rsync -aH --link-dest ${ftpdir} --delete --delete-after --ignore-errors ${ftpdir}/. .
252 }
253
254 function wb() {
255     log "Trigger daily wanna-build run"
256     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
257 }
258
259 function expire() {
260     log "Expiring old database dumps..."
261     cd $base/backup
262     $scriptsdir/expire_dumps -d . -p -f "dump_*"
263 }
264
265 function reports() {
266     # Send a report on NEW/BYHAND packages
267     log "Nagging ftpteam about NEW/BYHAND packages"
268     dak queue-report | mail -e -s "NEW and BYHAND on $(date +%D)" ftpmaster@ftp-master.debian.org
269     # and one on crufty packages
270     log "Sending information about crufty packages"
271     dak cruft-report > $webdir/cruft-report-daily.txt
272     dak cruft-report -s experimental >> $webdir/cruft-report-daily.txt
273     cat $webdir/cruft-report-daily.txt | mail -e -s "Debian archive cruft report for $(date +%D)" ftpmaster@ftp-master.debian.org
274 }
275
276 function dm() {
277     log "Updating DM html page"
278     $scriptsdir/dm-monitor >$webdir/dm-uploaders.html
279 }
280
281 function bts() {
282     log "Categorizing uncategorized bugs filed against ftp.debian.org"
283     dak bts-categorize
284 }
285
286 function merkel2() {
287     # Push dak@merkel so it syncs the projectb there. Returns immediately, the sync runs detached
288     log "Trigger merkels projectb sync"
289     ssh -2 -o BatchMode=yes -o SetupTimeOut=30 -o ConnectTimeout=30 -i ~/.ssh/push_merkel_projectb dak@merkel.debian.org sleep 1
290 }
291
292 function runparts() {
293     log "Using run-parts to run scripts in $base/scripts/distmnt"
294     run-parts --report $base/scripts/distmnt
295 }
296
297 function i18n2() {
298     log "Exporting package data foo for i18n project"
299     STAMP=$(date "+%Y%m%d%H%M")
300     mkdir -p ${scriptdir}/i18n/${STAMP}
301     cd ${scriptdir}/i18n/${STAMP}
302     dak control-suite -l stable > lenny
303     dak control-suite -l testing > squeeze
304     dak control-suite -l unstable > sid
305     echo "${STAMP}" > timestamp
306     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
307     rm -f md5sum
308     md5sum * > md5sum
309     cd ${webdir}/
310     ln -sfT ${scriptdir}/i18n/${STAMP} i18n
311
312     cd ${scriptdir}
313     find ./i18n -mindepth 1 -maxdepth 1 -mtime +2 -not -name "${STAMP}" -type d -print0 | xargs --no-run-if-empty -0 rm -rf
314 }
315
316 function stats() {
317     log "Updating stats data"
318     cd $configdir
319     $scriptsdir/update-ftpstats $base/log/* > $base/misc/ftpstats.data
320     R --slave --vanilla < $base/misc/ftpstats.R
321 }
322
323 function aptftpcleanup() {
324     log "Clean up apt-ftparchive's databases"
325     cd $configdir
326     apt-ftparchive -q clean apt.conf
327 }
328
329 function compress() {
330     log "Compress old psql backups"
331     cd $base/backup/
332     find -maxdepth 1 -mindepth 1 -type f -name 'dump_pre_*' -mtime +2 -print0 | xargs -0 --no-run-if-empty rm
333
334     find -maxdepth 1 -mindepth 1 -type f -name 'dump_*' \! -name '*.bz2' \! -name '*.gz' -mmin 720 |
335     while read dumpname; do
336         echo "Compressing $dumpname"
337         bzip2 -9v "$dumpname"
338     done
339     find -maxdepth 1 -mindepth 1 -type f -name "dumpall_*" \! -name '*.bz2' \! -name '*.gz' -mmin 720 |
340     while read dumpname; do
341         echo "Compressing $dumpname"
342         bzip2 -9v "$dumpname"
343     done
344     finddup -l -d $base/backup
345 }
346
347 function logstats() {
348     $masterdir/tools/logs.py "$1"
349 }
350
351 # save timestamp when we start
352 function savetimestamp() {
353         NOW=`date "+%Y.%m.%d-%H:%M:%S"`
354         echo ${NOW} > "${dbdir}/dinstallstart"
355 }
356
357 function maillogfile() {
358     cat "$LOGFILE" | mail -s "Log for dinstall run of ${NOW}" cron@ftp-master.debian.org
359 }
360
361 function renamelogfile() {
362     if [ -f "${dbdir}/dinstallstart" ]; then
363         NOW=$(cat "${dbdir}/dinstallstart")
364         maillogfile
365     mv "$LOGFILE" "$logdir/dinstall_${NOW}.log"
366         logstats "$logdir/dinstall_${NOW}.log"
367         bzip2 -9 "$logdir/dinstall_${NOW}.log"
368     else
369         error "Problem, I don't know when dinstall started, unable to do log statistics."
370         NOW=`date "+%Y.%m.%d-%H:%M:%S"`
371         maillogfile
372         mv "$LOGFILE" "$logdir/dinstall_${NOW}.log"
373         bzip2 -9 "$logdir/dinstall_${NOW}.log"
374     fi
375 }
376
377 function testingsourcelist() {
378     dak ls -s testing -f heidi -r .| egrep 'source$' > ${webdir}/testing.list
379 }
380 ########################################################################
381 ########################################################################
382
383 # Function to save which stage we are in, so we can restart an interrupted
384 # dinstall. Or even run actions in parallel, if we dare to, by simply
385 # backgrounding the call to this function. But that should only really be
386 # done for things we dont care much about.
387 #
388 # This should be called with the first argument being an array, with the
389 # members
390 #  - FUNC - the function name to call
391 #  - ARGS - Possible arguments to hand to the function. Can be the empty string
392 #  - TS   - The timestamp name. Can be the empty string
393 #  - ERR  - if this is the string false, then the call will be surrounded by
394 #           set +e ... set -e calls, so errors in the function do not exit
395 #           dinstall. Can be the empty string, meaning true.
396 #
397 # MAKE SURE TO KEEP THIS THE LAST FUNCTION, AFTER ALL THE VARIOUS ONES
398 # ADDED FOR DINSTALL FEATURES!
399 function stage() {
400     ARGS='GO[@]'
401     local "${!ARGS}"
402
403     if [ -f "${stagedir}/${FUNC}" ]; then
404         stamptime=$(/usr/bin/stat -c %Z "${stagedir}/${FUNC}")
405         unixtime=$(date +%s)
406         difference=$(( $unixtime - $stamptime ))
407         if [ ${difference} -ge 14400 ]; then
408             log_error "Did already run ${FUNC}, stagefile exists, but that was ${difference} seconds ago. Please check."
409         else
410             log "Did already run ${FUNC}, not calling again..."
411         fi
412         return
413     fi
414
415     debug "Now calling function ${FUNC}. Arguments: ${ARGS}. Timestamp: ${TS}"
416
417     # Make sure we are always at the same place. If a function wants to be elsewhere,
418     # it has to cd first!
419     cd ${configdir}
420
421     if [ -f "${LOCK_STOP}" ]; then
422         log "${LOCK_STOP} exists, exiting immediately"
423         exit 42
424     fi
425
426     if [ "${ERR}" = "false" ]; then
427         set +e
428     fi
429     ${FUNC} ${ARGS}
430
431     # No matter what happened in the function, we make sure we have set -e default state back
432     set -e
433
434     # Make sure we are always at the same place.
435     cd ${configdir}
436
437     touch "${stagedir}/${FUNC}"
438
439     if [ -n "${TIME}" ]; then
440         ts "${TIME}"
441     fi
442
443     if [ -f "${LOCK_STOP}" ]; then
444         log "${LOCK_STOP} exists, exiting immediately"
445         exit 42
446     fi
447 }
448
449 ########################################################################
450
451 # We need logs.
452 LOGFILE="$logdir/dinstall.log"
453
454 exec >> "$LOGFILE" 2>&1
455
456 # usually we are not using debug logs. Set to 1 if you want them.
457 DEBUG=0
458
459 # our name
460 PROGRAM="dinstall"
461
462 # where do we want mails to go? For example log entries made with error()
463 if [ "x$(hostname -s)x" != "xriesx" ]; then
464     # Not our ftpmaster host
465     MAILTO=${MAILTO:-"root"}
466 else
467     # Yay, ftpmaster
468     MAILTO=${MAILTO:-"ftpmaster@debian.org"}
469 fi
470
471 # How many logfiles to keep
472 LOGROTATE=${LOGROTATE:-400}
473
474 # Marker for dinstall start
475 DINSTALLSTART="${lockdir}/dinstallstart"
476 # Marker for dinstall end
477 DINSTALLEND="${lockdir}/dinstallend"
478
479 # Timestamps start at -1. so first gets 0
480 TS=-1
481 touch "${DINSTALLSTART}"
482 ts "startup"
483
484 # Tell everyone we are doing some work
485 NOTICE="$ftpdir/Archive_Maintenance_In_Progress"
486
487 # lock cron.unchecked (it immediately exits when this exists)
488 LOCK_DAILY="$lockdir/daily.lock"
489
490 # Lock process-new and cron.unchecked from doing work
491 LOCK_ACCEPTED="$lockdir/unchecked.lock"
492
493 # This file is simply used to indicate to britney whether or not
494 # the Packages file updates completed sucessfully.  It's not a lock
495 # from our point of view
496 LOCK_BRITNEY="$lockdir/britney.lock"
497
498 # If this file exists we exit immediately after the currently running
499 # function is done
500 LOCK_STOP="$lockdir/archive.stop"
501
502 lockfile -l 3600 "${LOCK_DAILY}"
503 trap onerror ERR
504 trap cleanup EXIT TERM HUP INT QUIT
505
506 touch "${LOCK_BRITNEY}"
507
508 GO=(
509     FUNC="savetimestamp"
510     TIME=""
511     ARGS=""
512     ERR="false"
513 )
514 stage $GO
515
516 GO=(
517     FUNC="notice"
518     TIME=""
519     ARGS=""
520     ERR="false"
521 )
522 stage $GO
523
524 GO=(
525     FUNC="merkel1"
526     TIME="init"
527     ARGS=""
528     ERR="false"
529 )
530 stage $GO
531
532 GO=(
533     FUNC="pgdump_pre"
534     TIME="pg_dump1"
535     ARGS=""
536     ERR=""
537 )
538 stage $GO
539
540 GO=(
541     FUNC="updates"
542     TIME="External Updates"
543     ARGS=""
544     ERR="false"
545 )
546 stage $GO
547
548 GO=(
549     FUNC="punew"
550     TIME="p-u-new"
551     ARGS="p-u-new"
552     ERR=""
553 )
554 stage $GO
555
556 GO=(
557     FUNC="opunew"
558     TIME="o-p-u-new"
559     ARGS="o-p-u-new"
560     ERR=""
561 )
562 stage $GO
563
564 GO=(
565     FUNC="i18n1"
566     TIME="i18n 1"
567     ARGS=""
568     ERR="false"
569 )
570 stage $GO
571
572 lockfile "$LOCK_ACCEPTED"
573
574 GO=(
575     FUNC="accepted"
576     TIME="accepted"
577     ARGS=""
578     ERR=""
579 )
580 stage $GO
581
582 GO=(
583     FUNC="cruft"
584     TIME="cruft"
585     ARGS=""
586     ERR=""
587 )
588 stage $GO
589
590 rm -f "$LOCK_ACCEPTED"
591
592 GO=(
593     FUNC="msfl"
594     TIME="make-suite-file-list"
595     ARGS=""
596     ERR=""
597 )
598 stage $GO
599
600 GO=(
601     FUNC="fingerprints"
602     TIME="import-keyring"
603     ARGS=""
604     ERR="false"
605 )
606 stage $GO
607
608 GO=(
609     FUNC="overrides"
610     TIME="overrides"
611     ARGS=""
612     ERR=""
613 )
614 stage $GO
615
616 GO=(
617     FUNC="mpfm"
618     TIME="pkg-file-mapping"
619     ARGS=""
620     ERR="false"
621 )
622 stage $GO
623
624 GO=(
625     FUNC="packages"
626     TIME="apt-ftparchive"
627     ARGS=""
628     ERR=""
629 )
630 stage $GO
631
632 GO=(
633     FUNC="pdiff"
634     TIME="pdiff"
635     ARGS=""
636     ERR=""
637 )
638 stage $GO
639
640 GO=(
641     FUNC="release"
642     TIME="release files"
643     ARGS=""
644     ERR=""
645 )
646 stage $GO
647
648 GO=(
649     FUNC="dakcleanup"
650     TIME="cleanup"
651     ARGS=""
652     ERR=""
653 )
654 stage $GO
655
656 GO=(
657     FUNC="buildd"
658     TIME="buildd"
659     ARGS=""
660     ERR=""
661 )
662 stage $GO
663
664 GO=(
665     FUNC="scripts"
666     TIME="scripts"
667     ARGS=""
668     ERR=""
669 )
670 stage $GO
671
672 GO=(
673     FUNC="mirror"
674     TIME="mirror hardlinks"
675     ARGS=""
676     ERR=""
677 )
678 stage $GO
679
680 GO=(
681     FUNC="wb"
682     TIME="w-b"
683     ARGS=""
684     ERR=""
685 )
686 stage $GO
687
688 rm -f "${NOTICE}"
689 rm -f "${LOCK_DAILY}"
690
691 ts "locked part finished"
692
693 GO=(
694     FUNC="pgdump_post"
695     TIME="pg_dump2"
696     ARGS=""
697     ERR=""
698 )
699 stage $GO
700
701 GO=(
702     FUNC="expire"
703     TIME="expire_dumps"
704     ARGS=""
705     ERR=""
706 )
707 stage $GO
708
709 GO=(
710     FUNC="reports"
711     TIME="reports"
712     ARGS=""
713     ERR=""
714 )
715 stage $GO
716
717 GO=(
718     FUNC="dm"
719     TIME=""
720     ARGS=""
721     ERR=""
722 )
723 stage $GO
724
725 GO=(
726     FUNC="bts"
727     TIME=""
728     ARGS=""
729     ERR="false"
730 )
731 stage $GO
732
733 GO=(
734     FUNC="merkel2"
735     TIME="merkel projectb push"
736     ARGS=""
737     ERR="false"
738 )
739 stage $GO
740
741 GO=(
742     FUNC="runparts"
743     TIME="run-parts"
744     ARGS=""
745     ERR="false"
746 )
747 stage $GO
748
749 GO=(
750     FUNC="i18n2"
751     TIME="i18n 2"
752     ARGS=""
753     ERR="false"
754 )
755 stage $GO
756
757 GO=(
758     FUNC="stats"
759     TIME="stats"
760     ARGS=""
761     ERR="false"
762 )
763 stage $GO
764
765 GO=(
766     FUNC="testingsourcelist"
767     TIME=""
768     ARGS=""
769     ERR="false"
770 )
771 stage $GO
772
773 rm -f ${LOCK_BRITNEY}
774
775 GO=(
776     FUNC="pgdakdev"
777     TIME="dak-dev db"
778     ARGS=""
779     ERR="false"
780 )
781 stage $GO
782
783 GO=(
784     FUNC="aptftpcleanup"
785     TIME="apt-ftparchive cleanup"
786     ARGS=""
787     ERR=""
788 )
789 stage $GO
790
791 GO=(
792     FUNC="compress"
793     TIME="compress"
794     ARGS=""
795     ERR=""
796 )
797 stage $GO
798
799 log "Daily cron scripts successful, all done"
800
801 exec > "$logdir/afterdinstall.log" 2>&1
802
803 GO=(
804     FUNC="renamelogfile"
805     TIME=""
806     ARGS=""
807     ERR="false"
808 )
809 stage $GO
810
811
812 # Now, at the very (successful) end of dinstall, make sure we remove
813 # our stage files, so the next dinstall run will do it all again.
814 rm -f ${stagedir}/*
815 touch "${DINSTALLEND}"