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