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