]> 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 # 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     # We always use the same umask. If a function wants to do different, fine, but we reset.
597     umask 022
598
599     touch "${STAGEFILE}"
600
601     if [ -n "${TIME}" ]; then
602         ts "${TIME}"
603     fi
604
605     # And the output goes back to the normal logfile
606     exec >> "$LOGFILE" 2>&1
607
608     # Now we should make sure that we have a usable dinstall.log, so append the $STAGEFILE.log
609     # to it.
610     cat "${STAGEFILE}.log" >> "${LOGFILE}"
611     rm -f "${STAGEFILE}.log"
612
613     if [ -f "${LOCK_STOP}" ]; then
614         log "${LOCK_STOP} exists, exiting immediately"
615         exit 42
616     fi
617 }
618
619 ########################################################################
620
621 # We need logs.
622 LOGFILE="$logdir/dinstall.log"
623
624 exec >> "$LOGFILE" 2>&1
625
626 # usually we are not using debug logs. Set to 1 if you want them.
627 DEBUG=0
628
629 # our name
630 PROGRAM="dinstall"
631
632 # where do we want mails to go? For example log entries made with error()
633 if [ "x$(hostname -s)x" != "xriesx" ]; then
634     # Not our ftpmaster host
635     MAILTO=${MAILTO:-"root"}
636 else
637     # Yay, ftpmaster
638     MAILTO=${MAILTO:-"ftpmaster@debian.org"}
639 fi
640
641 # Make sure we start out with a sane umask setting
642 umask 022
643
644 # And use one locale, no matter what the caller has set
645 export LANG=C
646 export LC_ALL=C
647
648 # How many logfiles to keep
649 LOGROTATE=${LOGROTATE:-400}
650
651 # Marker for dinstall start
652 DINSTALLSTART="${lockdir}/dinstallstart"
653 # Marker for dinstall end
654 DINSTALLEND="${lockdir}/dinstallend"
655
656 touch "${DINSTALLSTART}"
657 ts "startup"
658
659 # lock cron.unchecked (it immediately exits when this exists)
660 LOCK_DAILY="$lockdir/daily.lock"
661
662 # Lock cron.unchecked from doing work
663 LOCK_ACCEPTED="$lockdir/unchecked.lock"
664
665 # Lock process-new from doing work
666 LOCK_NEW="$lockdir/processnew.lock"
667
668 # This file is simply used to indicate to britney whether or not
669 # the Packages file updates completed sucessfully.  It's not a lock
670 # from our point of view
671 LOCK_BRITNEY="$lockdir/britney.lock"
672
673 # If this file exists we exit immediately after the currently running
674 # function is done
675 LOCK_STOP="$lockdir/archive.stop"
676
677 lockfile -l 3600 "${LOCK_DAILY}"
678 trap onerror ERR
679 trap cleanup EXIT TERM HUP INT QUIT
680
681 touch "${LOCK_BRITNEY}"
682
683 GO=(
684     FUNC="savetimestamp"
685     TIME=""
686     ARGS=""
687     ERR="false"
688 )
689 stage $GO
690
691 GO=(
692     FUNC="notice"
693     TIME=""
694     ARGS=""
695     ERR="false"
696 )
697 stage $GO
698
699 GO=(
700     FUNC="merkel1"
701     TIME="init"
702     ARGS=""
703     ERR="false"
704 )
705 stage $GO &
706
707 GO=(
708     FUNC="pgdump_pre"
709     TIME="pg_dump1"
710     ARGS=""
711     ERR=""
712 )
713 stage $GO
714
715 GO=(
716     FUNC="updates"
717     TIME="External Updates"
718     ARGS=""
719     ERR="false"
720 )
721 stage $GO &
722
723 GO=(
724     FUNC="punew"
725     TIME="p-u-new"
726     ARGS="p-u-new"
727     ERR=""
728 )
729 stage $GO
730
731 GO=(
732     FUNC="opunew"
733     TIME="o-p-u-new"
734     ARGS="o-p-u-new"
735     ERR=""
736 )
737 stage $GO
738
739 GO=(
740     FUNC="i18n1"
741     TIME="i18n 1"
742     ARGS=""
743     ERR="false"
744 )
745 stage $GO &
746
747 lockfile "$LOCK_ACCEPTED"
748 lockfile "$LOCK_NEW"
749
750 GO=(
751     FUNC="process_unchecked"
752     TIME=""
753     ARGS=""
754     ERR=""
755 )
756 stage $GO
757
758
759 GO=(
760     FUNC="accepted"
761     TIME="accepted"
762     ARGS=""
763     ERR=""
764 )
765 stage $GO
766
767 GO=(
768     FUNC="buildd_dir"
769     TIME="buildd_dir"
770     ARGS=""
771     ERR="false"
772 )
773 stage $GO
774
775 GO=(
776     FUNC="cruft"
777     TIME="cruft"
778     ARGS=""
779     ERR=""
780 )
781 stage $GO
782
783 rm -f "$LOCK_ACCEPTED"
784 rm -f "$LOCK_NEW"
785
786 GO=(
787     FUNC="msfl"
788     TIME="make-suite-file-list"
789     ARGS=""
790     ERR=""
791 )
792 stage $GO
793
794 GO=(
795     FUNC="fingerprints"
796     TIME="import-keyring"
797     ARGS=""
798     ERR="false"
799 )
800 stage $GO &
801
802 GO=(
803     FUNC="overrides"
804     TIME="overrides"
805     ARGS=""
806     ERR=""
807 )
808 stage $GO
809
810 GO=(
811     FUNC="mpfm"
812     TIME="pkg-file-mapping"
813     ARGS=""
814     ERR="false"
815 )
816 stage $GO
817
818 GO=(
819     FUNC="packages"
820     TIME="apt-ftparchive"
821     ARGS=""
822     ERR=""
823 )
824 stage $GO
825
826 GO=(
827     FUNC="pdiff"
828     TIME="pdiff"
829     ARGS=""
830     ERR=""
831 )
832 stage $GO
833
834 GO=(
835     FUNC="release"
836     TIME="release files"
837     ARGS=""
838     ERR=""
839 )
840 stage $GO
841
842 GO=(
843     FUNC="dakcleanup"
844     TIME="cleanup"
845     ARGS=""
846     ERR=""
847 )
848 stage $GO
849
850 GO=(
851     FUNC="buildd"
852     TIME="buildd"
853     ARGS=""
854     ERR=""
855 )
856 stage $GO
857
858 GO=(
859     FUNC="scripts"
860     TIME="scripts"
861     ARGS=""
862     ERR=""
863 )
864 stage $GO
865
866 GO=(
867     FUNC="mirror"
868     TIME="mirror hardlinks"
869     ARGS=""
870     ERR=""
871 )
872 stage $GO
873
874 GO=(
875     FUNC="wb"
876     TIME="w-b"
877     ARGS=""
878     ERR=""
879 )
880 stage $GO &
881
882 rm -f "${LOCK_DAILY}"
883
884 ts "locked part finished"
885
886 GO=(
887     FUNC="pgdump_post"
888     TIME="pg_dump2"
889     ARGS=""
890     ERR=""
891 )
892 stage $GO &
893
894 GO=(
895     FUNC="expire"
896     TIME="expire_dumps"
897     ARGS=""
898     ERR=""
899 )
900 stage $GO &
901
902 GO=(
903     FUNC="transitionsclean"
904     TIME="transitionsclean"
905     ARGS=""
906     ERR=""
907 )
908 stage $GO &
909
910 GO=(
911     FUNC="reports"
912     TIME="reports"
913     ARGS=""
914     ERR=""
915 )
916 stage $GO &
917
918 GO=(
919     FUNC="dm"
920     TIME=""
921     ARGS=""
922     ERR=""
923 )
924 stage $GO &
925
926 GO=(
927     FUNC="bts"
928     TIME=""
929     ARGS=""
930     ERR="false"
931 )
932 stage $GO &
933
934 GO=(
935     FUNC="merkel2"
936     TIME="merkel projectb push"
937     ARGS=""
938     ERR="false"
939 )
940 stage $GO &
941
942 GO=(
943     FUNC="mirrorpush"
944     TIME="mirrorpush"
945     ARGS=""
946     ERR="false"
947 )
948 stage $GO
949
950 GO=(
951     FUNC="i18n2"
952     TIME="i18n 2"
953     ARGS=""
954     ERR="false"
955 )
956 stage $GO
957
958 GO=(
959     FUNC="stats"
960     TIME="stats"
961     ARGS=""
962     ERR="false"
963 )
964 stage $GO &
965
966 GO=(
967     FUNC="testingsourcelist"
968     TIME=""
969     ARGS=""
970     ERR="false"
971 )
972 stage $GO
973
974 rm -f ${LOCK_BRITNEY}
975
976 GO=(
977     FUNC="pgdakdev"
978     TIME="dak-dev db"
979     ARGS=""
980     ERR="false"
981 )
982 stage $GO &
983
984 GO=(
985     FUNC="merkel3"
986     TIME="merkel ddaccessible sync"
987     ARGS=""
988     ERR="false"
989 )
990 stage $GO &
991
992 GO=(
993     FUNC="compress"
994     TIME="compress"
995     ARGS=""
996     ERR=""
997 )
998 stage $GO &
999
1000 GO=(
1001     FUNC="aptftpcleanup"
1002     TIME="apt-ftparchive cleanup"
1003     ARGS=""
1004     ERR="false"
1005 )
1006 stage $GO
1007
1008 log "Daily cron scripts successful, all done"
1009
1010 exec > "$logdir/afterdinstall.log" 2>&1
1011
1012 GO=(
1013     FUNC="renamelogfile"
1014     TIME=""
1015     ARGS=""
1016     ERR="false"
1017 )
1018 stage $GO
1019
1020
1021 # Now, at the very (successful) end of dinstall, make sure we remove
1022 # our stage files, so the next dinstall run will do it all again.
1023 rm -f ${stagedir}/*
1024 touch "${DINSTALLEND}"