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