]> git.decadent.org.uk Git - dak.git/blob - config/debian/cron.dinstall
dak update-db: fixes to make it work on a fresh install
[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 # exit on errors
20 set -e
21 # make sure to only use defined variables
22 set -u
23
24 # import the general variable set.
25 export SCRIPTVARS=/srv/ftp.debian.org/dak/config/debian/vars
26 . $SCRIPTVARS
27
28 ########################################################################
29 # Functions                                                            #
30 ########################################################################
31 # common functions are "outsourced"
32 . "${configdir}/common"
33
34 # Timestamp. Used for dinstall stat graphs
35 function ts() {
36         TS=$(($TS+1));
37         echo "Archive maintenance timestamp $TS ($1): $(date +%H:%M:%S)"
38 }
39
40 # Cleanup actions
41 function cleanup() {
42         rm -f ${LOCK_DAILY}
43         rm -f ${LOCK_ACCEPTED}
44 }
45
46 ########################################################################
47 # the actual dinstall functions follow                                 #
48 ########################################################################
49
50 # Setup the notice file to tell bad mirrors they used the wrong time
51 function notice() {
52     rm -f "$NOTICE"
53     cat > "$NOTICE" <<EOF
54 Packages are currently being installed and indices rebuilt.
55 Maintenance is automatic, starting at 01|07|13|19:52 UTC,
56 and ending about an hour later.  This file is then removed.
57
58 You should not mirror the archive during this period.
59 EOF
60 }
61
62 # pushing merkels QA user, part one
63 function merkel1() {
64     log "Telling merkels QA user that we start dinstall"
65     ssh -2 -i ~dak/.ssh/push_merkel_qa  -o BatchMode=yes -o SetupTimeOut=90 -o ConnectTimeout=90 qa@merkel.debian.org sleep 1
66 }
67
68 # Create the postgres dump files
69 function pgdump_pre() {
70     log "Creating pre-daily-cron-job backup of projectb database..."
71     pg_dump projectb > $base/backup/dump_$(date +%Y.%m.%d-%H:%M:%S)
72 }
73
74 function pgdump_post() {
75     log "Creating post-daily-cron-job backup of projectb database..."
76     cd $base/backup
77     POSTDUMP=$(date +%Y.%m.%d-%H:%M:%S)
78     pg_dump projectb > $base/backup/dump_$POSTDUMP
79     pg_dumpall --globals-only > $base/backup/dumpall_$POSTDUMP
80     ln -sf $base/backup/dump_$POSTDUMP current
81     ln -sf $base/backup/dumpall_$POSTDUMP currentall
82 }
83
84 # Load the dak-dev projectb
85 function pgdakdev() {
86     cd $base/backup
87     echo "drop database projectb" | psql -p 5433 template1
88         cat currentall | psql -p 5433 template1
89     createdb -p 5433 -T template0 projectb
90     fgrep -v '\connect' `cat current` | psql -p 5433 projectb
91 }
92
93 # Updating various files
94 function updates() {
95     log "Updating Bugs docu, Mirror list and mailing-lists.txt"
96     cd $configdir
97     $scriptsdir/update-bugdoctxt
98     $scriptsdir/update-mirrorlists
99     $scriptsdir/update-mailingliststxt
100     $scriptsdir/update-pseudopackages.sh
101 }
102
103 # Process (oldstable)-proposed-updates "NEW" queue
104 function punew_do() {
105     cd "${queuedir}/${1}"
106     date -u -R >> REPORT
107     dak process-new -a -C COMMENTS >> REPORT || true
108     echo >> REPORT
109 }
110 function punew() {
111     log "Doing automated p-u-new processing"
112     punew_do "$1"
113 }
114 function opunew() {
115     log "Doing automated o-p-u-new processing"
116     punew_do "$1"
117 }
118
119 # The first i18n one, syncing new descriptions
120 function i18n1() {
121     log "Synchronizing i18n package descriptions"
122     # First sync their newest data
123     cd ${scriptdir}/i18nsync
124     rsync -aq --delete --delete-after ddtp-sync:/does/not/matter . || true
125
126     # Now check if we still know about the packages for which they created the files
127     # is the timestamp signed by us?
128     if $(gpgv --keyring /srv/ftp.debian.org/s3kr1t/dot-gnupg/pubring.gpg timestamp.gpg timestamp); then
129         # now read it. As its signed by us we are sure the content is what we expect, no need
130         # to do more here. And we only test -d a directory on it anyway.
131         TSTAMP=$(cat timestamp)
132         # do we have the dir still?
133         if [ -d ${scriptdir}/i18n/${TSTAMP} ]; then
134             # Lets check!
135             if ${scriptsdir}/ddtp-i18n-check.sh . ${scriptdir}/i18n/${TSTAMP}; then
136                 # Yay, worked, lets copy around
137                 for dir in squeeze sid; do
138                     if [ -d dists/${dir}/ ]; then
139                         cd dists/${dir}/main/i18n
140                         rsync -aq --delete --delete-after  . ${ftpdir}/dists/${dir}/main/i18n/.
141                     fi
142                     cd ${scriptdir}/i18nsync
143                 done
144             else
145                 echo "ARRRR, bad guys, wrong files, ARRR"
146                 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
147             fi
148         else
149             echo "ARRRR, missing the timestamp ${TSTAMP} directory, not updating i18n, ARRR"
150             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
151         fi
152     else
153         echo "ARRRRRRR, could not verify our timestamp signature, ARRR. Don't mess with our files, i18n guys, ARRRRR."
154         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
155     fi
156 }
157
158 # Process the accepted queue
159 function accepted() {
160     log "Processing queue/accepted"
161     rm -f "$accepted/REPORT"
162     dak process-accepted -pa -d "$accepted" > "$accepted/REPORT"
163     cat "$accepted/REPORT" | mail -s "Install for $(date +"%D - %R")" ftpmaster@ftp-master.debian.org
164     chgrp debadmin "$accepted/REPORT"
165     chmod 664 "$accepted/REPORT"
166 }
167
168 function cruft() {
169     log "Checking for cruft in overrides"
170     dak check-overrides
171
172     log "Fixing symlinks in $ftpdir"
173     symlinks -d -r $ftpdir
174 }
175
176 function msfl() {
177     log "Generating suite file lists for apt-ftparchive"
178     dak make-suite-file-list
179 }
180
181 function fingerprints() {
182     log "Updating fingerprints"
183     dak import-keyring -L /srv/keyring.debian.org/keyrings/debian-keyring.gpg
184 }
185
186 function overrides() {
187     log "Writing overrides into text files"
188     cd $overridedir
189     dak make-overrides
190
191     # FIXME
192     rm -f override.sid.all3
193     for i in main contrib non-free main.debian-installer; do cat override.sid.$i >> override.sid.all3; done
194 }
195
196 function mpfm() {
197     log "Generating package / file mapping"
198     dak make-pkg-file-mapping | bzip2 -9 > $base/ftp/indices/package-file.map.bz2
199 }
200
201 function packages() {
202     log "Generating Packages and Sources files"
203     cd $configdir
204     apt-ftparchive generate apt.conf
205 }
206
207 function pdiff() {
208     log "Generating pdiff files"
209     dak generate-index-diffs
210 }
211
212 function release() {
213     log "Generating Release files"
214     dak generate-releases
215 }
216
217 function dakcleanup() {
218     log "Cleanup old packages/files"
219     dak clean-suites
220     dak clean-queues
221 }
222
223 function buildd() {
224     # Needs to be rebuilt, as files have moved.  Due to unaccepts, we need to
225     # update this before wanna-build is updated.
226     log "Regenerating wanna-build/buildd information"
227     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
228     symlinks -d /srv/incoming.debian.org/buildd > /dev/null
229     apt-ftparchive generate apt.conf.buildd
230 }
231
232 function scripts() {
233     log "Running various scripts from $scriptsdir"
234     cd $scriptsdir
235     ./mkmaintainers
236     ./copyoverrides
237     ./mklslar
238     ./mkfilesindices
239     ./mkchecksums
240 }
241
242 function mirror() {
243     echo "Regenerating \"public\" mirror/ hardlink fun"
244     cd ${mirrordir}
245     rsync -aH --link-dest ${ftpdir} --delete --delete-after --ignore-errors ${ftpdir}/. .
246 }
247
248 function wb() {
249     log "Trigger daily wanna-build run"
250     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
251 }
252
253 function expire() {
254     log "Expiring old database dumps..."
255     cd $base/backup
256     $scriptsdir/expire_dumps -d . -p -f "dump_*"
257 }
258
259 function reports() {
260     # Send a report on NEW/BYHAND packages
261     log "Nagging ftpteam about NEW/BYHAND packages"
262     dak queue-report | mail -e -s "NEW and BYHAND on $(date +%D)" ftpmaster@ftp-master.debian.org
263     # and one on crufty packages
264     log "Sending information about crufty packages"
265     dak cruft-report > $webdir/cruft-report-daily.txt
266     dak cruft-report -s experimental >> $webdir/cruft-report-daily.txt
267     cat $webdir/cruft-report-daily.txt | mail -e -s "Debian archive cruft report for $(date +%D)" ftpmaster@ftp-master.debian.org
268 }
269
270 function dm() {
271     log "Updating DM html page"
272     $scriptsdir/dm-monitor >$webdir/dm-uploaders.html
273 }
274
275 function bts() {
276     log "Categorizing uncategorized bugs filed against ftp.debian.org"
277     dak bts-categorize
278 }
279
280 function merkel2() {
281     # Push katie@merkel so it syncs the projectb there. Returns immediately, the sync runs detached
282     log "Trigger merkels projectb sync"
283     ssh -2 -o BatchMode=yes -o SetupTimeOut=30 -o ConnectTimeout=30 -i ~/.ssh/push_merkel_projectb katie@merkel.debian.org sleep 1
284 }
285
286 function runparts() {
287     log "Using run-parts to run scripts in $base/scripts/distmnt"
288     run-parts --report $base/scripts/distmnt
289 }
290
291 function i18n2() {
292     log "Exporting package data foo for i18n project"
293     STAMP=$(date "+%Y%m%d%H%M")
294     mkdir -p ${scriptdir}/i18n/${STAMP}
295     cd ${scriptdir}/i18n/${STAMP}
296     dak control-suite -l stable > lenny
297     dak control-suite -l testing > squeeze
298     dak control-suite -l unstable > sid
299     echo "${STAMP}" > timestamp
300     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 6070D3A1 --detach-sign -o timestamp.gpg timestamp
301     rm -f md5sum
302     md5sum * > md5sum
303     cd ${webdir}/
304     ln -sfT ${scriptdir}/i18n/${STAMP} i18n
305
306     cd ${scriptdir}
307     find ./i18n -mindepth 1 -maxdepth 1 -mtime +2 -not -name "${STAMP}" -type d -print0 | xargs --no-run-if-empty -0 rm -rf
308 }
309
310 function stats() {
311     log "Updating stats data"
312     cd $configdir
313     $scriptsdir/update-ftpstats $base/log/* > $base/misc/ftpstats.data
314     R --slave --vanilla < $base/misc/ftpstats.R
315 }
316
317 function aptftpcleanup() {
318     log "Clean up apt-ftparchive's databases"
319     cd $configdir
320     apt-ftparchive -q clean apt.conf
321 }
322
323 function compress() {
324     log "Compress old psql backups"
325     cd $base/backup/
326     find -maxdepth 1 -mindepth 1 -type f -name 'dump_*' \! -name '*.bz2' \! -name '*.gz' -mtime +1 |
327     while read dumpname; do
328         echo "Compressing $dumpname"
329         bzip2 -9v "$dumpname"
330     done
331 }
332
333 function logstats() {
334     $masterdir/tools/logs.py "$1"
335 }
336
337 # save timestamp when we start
338 function savetimestamp() {
339         NOW=`date "+%Y.%m.%d-%H:%M:%S"`
340         echo ${NOW} > "${dbdir}/dinstallstart"
341 }
342
343 function renamelogfile() {
344         if [ -f "${dbdir}/dinstallstart" ]; then
345                 RENAMETO=$(cat "${dbdir}/dinstallstart")
346                 mv "$LOGFILE" "$logdir/dinstall_${RENAMETO}.log"
347                 logstats "$logdir/dinstall_${RENAMETO}.log"
348                 bzip2 -9 "$logdir/dinstall_${RENAMETO}.log"
349         else
350                 error "Problem, I don't know when dinstall started, unable to do log statistics."
351                 NOW=`date "+%Y.%m.%d-%H:%M:%S"`
352                 mv "$LOGFILE" "$logdir/dinstall_${NOW}.log"
353                 bzip2 -9 "$logdir/dinstall_${NOW}.log"
354         fi
355 }
356
357 ########################################################################
358 ########################################################################
359
360 # Function to save which stage we are in, so we can restart an interrupted
361 # dinstall. Or even run actions in parallel, if we dare to, by simply
362 # backgrounding the call to this function. But that should only really be
363 # done for things we dont care much about.
364 #
365 # This should be called with the first argument being an array, with the
366 # members
367 #  - FUNC - the function name to call
368 #  - ARGS - Possible arguments to hand to the function. Can be the empty string
369 #  - TS   - The timestamp name. Can be the empty string
370 #  - ERR  - if this is the string false, then the call will be surrounded by
371 #           set +e ... set -e calls, so errors in the function do not exit
372 #           dinstall. Can be the empty string, meaning true.
373 #
374 # MAKE SURE TO KEEP THIS THE LAST FUNCTION, AFTER ALL THE VARIOUS ONES
375 # ADDED FOR DINSTALL FEATURES!
376 function stage() {
377     ARGS='GO[@]'
378     local "${!ARGS}"
379
380     if [ -f "${stagedir}/${FUNC}" ]; then
381         stamptime=$(/usr/bin/stat -c %Z "${stagedir}/${FUNC}")
382         unixtime=$(date +%s)
383         difference=$(( $unixtime - $stamptime ))
384         if [ ${difference} -ge 14400 ]; then
385             log_error "Did already run ${FUNC}, stagefile exists, but that was ${difference} seconds ago. Please check."
386         else
387             log "Did already run ${FUNC}, not calling again..."
388         fi
389         return
390     fi
391
392     debug "Now calling function ${FUNC}. Arguments: ${ARGS}. Timestamp: ${TS}"
393
394     # Make sure we are always at the same place. If a function wants to be elsewhere,
395     # it has to cd first!
396     cd ${configdir}
397
398         if [ -f "${LOCK_STOP}" ]; then
399                 log "${LOCK_STOP} exists, exiting immediately"
400                 exit 42
401         fi
402
403     if [ "${ERR}" = "false" ]; then
404         set +e
405     fi
406     ${FUNC} ${ARGS}
407
408     # No matter what happened in the function, we make sure we have set -e default state back
409     set -e
410
411     # Make sure we are always at the same place.
412     cd ${configdir}
413
414     touch "${stagedir}/${FUNC}"
415
416     if [ -n "${TIME}" ]; then
417         ts "${TIME}"
418     fi
419
420         if [ -f "${LOCK_STOP}" ]; then
421                 log "${LOCK_STOP} exists, exiting immediately"
422                 exit 42
423         fi
424 }
425
426 ########################################################################
427
428 # We need logs.
429 LOGFILE="$logdir/dinstall.log"
430
431 exec >> "$LOGFILE" 2>&1
432
433 # usually we are not using debug logs. Set to 1 if you want them.
434 DEBUG=0
435
436 # our name
437 PROGRAM="dinstall"
438
439 # where do we want mails to go? For example log entries made with error()
440 if [ "x$(hostname -s)x" != "xriesx" ]; then
441     # Not our ftpmaster host
442     MAILTO=${MAILTO:-"root"}
443 else
444     # Yay, ftpmaster
445     MAILTO=${MAILTO:-"ftpmaster@debian.org"}
446 fi
447
448 # How many logfiles to keep
449 LOGROTATE=${LOGROTATE:-400}
450
451 # Marker for dinstall start
452 DINSTALLSTART="${lockdir}/dinstallstart"
453 # Marker for dinstall end
454 DINSTALLEND="${lockdir}/dinstallend"
455
456 # Timestamps start at -1. so first gets 0
457 TS=-1
458 touch "${DINSTALLSTART}"
459 ts "startup"
460
461 # Tell everyone we are doing some work
462 NOTICE="$ftpdir/Archive_Maintenance_In_Progress"
463
464 # lock cron.unchecked (it immediately exits when this exists)
465 LOCK_DAILY="$lockdir/daily.lock"
466
467 # Lock process-new and cron.unchecked from doing work
468 LOCK_ACCEPTED="$lockdir/unchecked.lock"
469
470 # This file is simply used to indicate to britney whether or not
471 # the Packages file updates completed sucessfully.  It's not a lock
472 # from our point of view
473 LOCK_BRITNEY="$lockdir/britney.lock"
474
475 # If this file exists we exit immediately after the currently running
476 # function is done
477 LOCK_STOP="$lockdir/archive.stop"
478
479 lockfile -l 3600 "${LOCK_DAILY}"
480 trap cleanup EXIT ERR TERM HUP INT QUIT
481
482 touch "${LOCK_BRITNEY}"
483
484 GO=(
485     FUNC="savetimestamp"
486     TIME=""
487     ARGS=""
488     ERR="false"
489 )
490 stage $GO
491
492 GO=(
493     FUNC="notice"
494     TIME=""
495     ARGS=""
496     ERR="false"
497 )
498 stage $GO
499
500 GO=(
501     FUNC="merkel1"
502     TIME="init"
503     ARGS=""
504     ERR="false"
505 )
506 stage $GO
507
508 GO=(
509     FUNC="pgdump_pre"
510     TIME="pg_dump1"
511     ARGS=""
512     ERR=""
513 )
514 stage $GO
515
516 GO=(
517     FUNC="updates"
518     TIME="External Updates"
519     ARGS=""
520     ERR="false"
521 )
522 stage $GO
523
524 GO=(
525     FUNC="punew"
526     TIME="p-u-new"
527     ARGS="p-u-new"
528     ERR=""
529 )
530 stage $GO
531
532 GO=(
533     FUNC="opunew"
534     TIME="o-p-u-new"
535     ARGS="o-p-u-new"
536     ERR=""
537 )
538 stage $GO
539
540 GO=(
541     FUNC="i18n1"
542     TIME="i18n 1"
543     ARGS=""
544     ERR="false"
545 )
546 stage $GO
547
548 lockfile "$LOCK_ACCEPTED"
549
550 GO=(
551     FUNC="accepted"
552     TIME="accepted"
553     ARGS=""
554     ERR=""
555 )
556 stage $GO
557
558 GO=(
559     FUNC="cruft"
560     TIME="cruft"
561     ARGS=""
562     ERR=""
563 )
564 stage $GO
565
566 rm -f "$LOCK_ACCEPTED"
567
568 GO=(
569     FUNC="msfl"
570     TIME="make-suite-file-list"
571     ARGS=""
572     ERR=""
573 )
574 stage $GO
575
576 GO=(
577     FUNC="fingerprints"
578     TIME="import-keyring"
579     ARGS=""
580     ERR="false"
581 )
582 stage $GO
583
584 GO=(
585     FUNC="overrides"
586     TIME="overrides"
587     ARGS=""
588     ERR=""
589 )
590 stage $GO
591
592 GO=(
593     FUNC="mpfm"
594     TIME="pkg-file-mapping"
595     ARGS=""
596     ERR="false"
597 )
598 stage $GO
599
600 GO=(
601     FUNC="packages"
602     TIME="apt-ftparchive"
603     ARGS=""
604     ERR=""
605 )
606 stage $GO
607
608 GO=(
609     FUNC="pdiff"
610     TIME="pdiff"
611     ARGS=""
612     ERR=""
613 )
614 stage $GO
615
616 GO=(
617     FUNC="release"
618     TIME="release files"
619     ARGS=""
620     ERR=""
621 )
622 stage $GO
623
624 GO=(
625     FUNC="dakcleanup"
626     TIME="cleanup"
627     ARGS=""
628     ERR=""
629 )
630 stage $GO
631
632 GO=(
633     FUNC="buildd"
634     TIME="buildd"
635     ARGS=""
636     ERR=""
637 )
638 stage $GO
639
640 GO=(
641     FUNC="scripts"
642     TIME="scripts"
643     ARGS=""
644     ERR=""
645 )
646 stage $GO
647
648 GO=(
649     FUNC="mirror"
650     TIME="mirror hardlinks"
651     ARGS=""
652     ERR=""
653 )
654 stage $GO
655
656 GO=(
657     FUNC="wb"
658     TIME="w-b"
659     ARGS=""
660     ERR=""
661 )
662 stage $GO
663
664 rm -f "${NOTICE}"
665 rm -f "${LOCK_DAILY}"
666
667 ts "locked part finished"
668
669 GO=(
670     FUNC="pgdump_post"
671     TIME="pg_dump2"
672     ARGS=""
673     ERR=""
674 )
675 stage $GO
676
677 GO=(
678         FUNC="pgdakdev"
679         TIME="dak-dev db"
680         ARGS=""
681         ERR="false"
682 )
683 stage $GO
684
685 GO=(
686     FUNC="expire"
687     TIME="expire_dumps"
688     ARGS=""
689     ERR=""
690 )
691 stage $GO
692
693 GO=(
694     FUNC="reports"
695     TIME="reports"
696     ARGS=""
697     ERR=""
698 )
699 stage $GO
700
701 GO=(
702     FUNC="dm"
703     TIME=""
704     ARGS=""
705     ERR=""
706 )
707 stage $GO
708
709 GO=(
710     FUNC="bts"
711     TIME=""
712     ARGS=""
713     ERR=""
714 )
715 stage $GO
716
717 GO=(
718     FUNC="merkel2"
719     TIME="merkel projectb push"
720     ARGS=""
721     ERR="false"
722 )
723 stage $GO
724
725 ulimit -m 90000 -d 90000 -s 10000 -v 200000
726
727 GO=(
728     FUNC="runparts"
729     TIME="run-parts"
730     ARGS=""
731     ERR="false"
732 )
733 stage $GO
734
735 GO=(
736     FUNC="i18n2"
737     TIME="i18n 2"
738     ARGS=""
739     ERR="false"
740 )
741 stage $GO
742
743 GO=(
744     FUNC="stats"
745     TIME="stats"
746     ARGS=""
747     ERR="false"
748 )
749 stage $GO
750
751 rm -f ${LOCK_BRITNEY}
752
753 GO=(
754     FUNC="aptftpcleanup"
755     TIME="apt-ftparchive cleanup"
756     ARGS=""
757     ERR=""
758 )
759 stage $GO
760
761 GO=(
762     FUNC="compress"
763     TIME="compress"
764     ARGS=""
765     ERR=""
766 )
767 stage $GO
768
769 log "Daily cron scripts successful, all done"
770
771 exec > "$logdir/afterdinstall.log" 2>&1
772
773 cat "$LOGFILE" | mail -s "Log for dinstall run of ${NOW}" cron@ftp-master.debian.org
774
775 GO=(
776     FUNC="renamelogfile"
777     TIME=""
778     ARGS=""
779     ERR="false"
780 )
781 stage $GO
782
783
784 # Now, at the very (successful) end of dinstall, make sure we remove
785 # our stage files, so the next dinstall run will do it all again.
786 rm -f ${stagedir}/*
787 touch "${DINSTALLEND}"