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