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