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