]> 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 # 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' 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 function testingsourcelist() {
358     dak ls -s testing -f heidi -r .| egrep 'source$' > ${webdir}/testing.list
359 }
360 ########################################################################
361 ########################################################################
362
363 # Function to save which stage we are in, so we can restart an interrupted
364 # dinstall. Or even run actions in parallel, if we dare to, by simply
365 # backgrounding the call to this function. But that should only really be
366 # done for things we dont care much about.
367 #
368 # This should be called with the first argument being an array, with the
369 # members
370 #  - FUNC - the function name to call
371 #  - ARGS - Possible arguments to hand to the function. Can be the empty string
372 #  - TS   - The timestamp name. Can be the empty string
373 #  - ERR  - if this is the string false, then the call will be surrounded by
374 #           set +e ... set -e calls, so errors in the function do not exit
375 #           dinstall. Can be the empty string, meaning true.
376 #
377 # MAKE SURE TO KEEP THIS THE LAST FUNCTION, AFTER ALL THE VARIOUS ONES
378 # ADDED FOR DINSTALL FEATURES!
379 function stage() {
380     ARGS='GO[@]'
381     local "${!ARGS}"
382
383     if [ -f "${stagedir}/${FUNC}" ]; then
384         stamptime=$(/usr/bin/stat -c %Z "${stagedir}/${FUNC}")
385         unixtime=$(date +%s)
386         difference=$(( $unixtime - $stamptime ))
387         if [ ${difference} -ge 14400 ]; then
388             log_error "Did already run ${FUNC}, stagefile exists, but that was ${difference} seconds ago. Please check."
389         else
390             log "Did already run ${FUNC}, not calling again..."
391         fi
392         return
393     fi
394
395     debug "Now calling function ${FUNC}. Arguments: ${ARGS}. Timestamp: ${TS}"
396
397     # Make sure we are always at the same place. If a function wants to be elsewhere,
398     # it has to cd first!
399     cd ${configdir}
400
401         if [ -f "${LOCK_STOP}" ]; then
402                 log "${LOCK_STOP} exists, exiting immediately"
403                 exit 42
404         fi
405
406     if [ "${ERR}" = "false" ]; then
407         set +e
408     fi
409     ${FUNC} ${ARGS}
410
411     # No matter what happened in the function, we make sure we have set -e default state back
412     set -e
413
414     # Make sure we are always at the same place.
415     cd ${configdir}
416
417     touch "${stagedir}/${FUNC}"
418
419     if [ -n "${TIME}" ]; then
420         ts "${TIME}"
421     fi
422
423         if [ -f "${LOCK_STOP}" ]; then
424                 log "${LOCK_STOP} exists, exiting immediately"
425                 exit 42
426         fi
427 }
428
429 ########################################################################
430
431 # We need logs.
432 LOGFILE="$logdir/dinstall.log"
433
434 exec >> "$LOGFILE" 2>&1
435
436 # usually we are not using debug logs. Set to 1 if you want them.
437 DEBUG=0
438
439 # our name
440 PROGRAM="dinstall"
441
442 # where do we want mails to go? For example log entries made with error()
443 if [ "x$(hostname -s)x" != "xriesx" ]; then
444     # Not our ftpmaster host
445     MAILTO=${MAILTO:-"root"}
446 else
447     # Yay, ftpmaster
448     MAILTO=${MAILTO:-"ftpmaster@debian.org"}
449 fi
450
451 # How many logfiles to keep
452 LOGROTATE=${LOGROTATE:-400}
453
454 # Marker for dinstall start
455 DINSTALLSTART="${lockdir}/dinstallstart"
456 # Marker for dinstall end
457 DINSTALLEND="${lockdir}/dinstallend"
458
459 # Timestamps start at -1. so first gets 0
460 TS=-1
461 touch "${DINSTALLSTART}"
462 ts "startup"
463
464 # Tell everyone we are doing some work
465 NOTICE="$ftpdir/Archive_Maintenance_In_Progress"
466
467 # lock cron.unchecked (it immediately exits when this exists)
468 LOCK_DAILY="$lockdir/daily.lock"
469
470 # Lock process-new and cron.unchecked from doing work
471 LOCK_ACCEPTED="$lockdir/unchecked.lock"
472
473 # This file is simply used to indicate to britney whether or not
474 # the Packages file updates completed sucessfully.  It's not a lock
475 # from our point of view
476 LOCK_BRITNEY="$lockdir/britney.lock"
477
478 # If this file exists we exit immediately after the currently running
479 # function is done
480 LOCK_STOP="$lockdir/archive.stop"
481
482 lockfile -l 3600 "${LOCK_DAILY}"
483 trap cleanup EXIT ERR TERM HUP INT QUIT
484
485 touch "${LOCK_BRITNEY}"
486
487 GO=(
488     FUNC="savetimestamp"
489     TIME=""
490     ARGS=""
491     ERR="false"
492 )
493 stage $GO
494
495 GO=(
496     FUNC="notice"
497     TIME=""
498     ARGS=""
499     ERR="false"
500 )
501 stage $GO
502
503 GO=(
504     FUNC="merkel1"
505     TIME="init"
506     ARGS=""
507     ERR="false"
508 )
509 stage $GO
510
511 GO=(
512     FUNC="pgdump_pre"
513     TIME="pg_dump1"
514     ARGS=""
515     ERR=""
516 )
517 stage $GO
518
519 GO=(
520     FUNC="updates"
521     TIME="External Updates"
522     ARGS=""
523     ERR="false"
524 )
525 stage $GO
526
527 GO=(
528     FUNC="punew"
529     TIME="p-u-new"
530     ARGS="p-u-new"
531     ERR=""
532 )
533 stage $GO
534
535 GO=(
536     FUNC="opunew"
537     TIME="o-p-u-new"
538     ARGS="o-p-u-new"
539     ERR=""
540 )
541 stage $GO
542
543 GO=(
544     FUNC="i18n1"
545     TIME="i18n 1"
546     ARGS=""
547     ERR="false"
548 )
549 stage $GO
550
551 lockfile "$LOCK_ACCEPTED"
552
553 GO=(
554     FUNC="accepted"
555     TIME="accepted"
556     ARGS=""
557     ERR=""
558 )
559 stage $GO
560
561 GO=(
562     FUNC="cruft"
563     TIME="cruft"
564     ARGS=""
565     ERR=""
566 )
567 stage $GO
568
569 rm -f "$LOCK_ACCEPTED"
570
571 GO=(
572     FUNC="msfl"
573     TIME="make-suite-file-list"
574     ARGS=""
575     ERR=""
576 )
577 stage $GO
578
579 GO=(
580     FUNC="fingerprints"
581     TIME="import-keyring"
582     ARGS=""
583     ERR="false"
584 )
585 stage $GO
586
587 GO=(
588     FUNC="overrides"
589     TIME="overrides"
590     ARGS=""
591     ERR=""
592 )
593 stage $GO
594
595 GO=(
596     FUNC="mpfm"
597     TIME="pkg-file-mapping"
598     ARGS=""
599     ERR="false"
600 )
601 stage $GO
602
603 GO=(
604     FUNC="packages"
605     TIME="apt-ftparchive"
606     ARGS=""
607     ERR=""
608 )
609 stage $GO
610
611 GO=(
612     FUNC="pdiff"
613     TIME="pdiff"
614     ARGS=""
615     ERR=""
616 )
617 stage $GO
618
619 GO=(
620     FUNC="release"
621     TIME="release files"
622     ARGS=""
623     ERR=""
624 )
625 stage $GO
626
627 GO=(
628     FUNC="dakcleanup"
629     TIME="cleanup"
630     ARGS=""
631     ERR=""
632 )
633 stage $GO
634
635 GO=(
636     FUNC="buildd"
637     TIME="buildd"
638     ARGS=""
639     ERR=""
640 )
641 stage $GO
642
643 GO=(
644     FUNC="scripts"
645     TIME="scripts"
646     ARGS=""
647     ERR=""
648 )
649 stage $GO
650
651 GO=(
652     FUNC="mirror"
653     TIME="mirror hardlinks"
654     ARGS=""
655     ERR=""
656 )
657 stage $GO
658
659 GO=(
660     FUNC="wb"
661     TIME="w-b"
662     ARGS=""
663     ERR=""
664 )
665 stage $GO
666
667 rm -f "${NOTICE}"
668 rm -f "${LOCK_DAILY}"
669
670 ts "locked part finished"
671
672 GO=(
673     FUNC="pgdump_post"
674     TIME="pg_dump2"
675     ARGS=""
676     ERR=""
677 )
678 stage $GO
679
680 GO=(
681         FUNC="pgdakdev"
682         TIME="dak-dev db"
683         ARGS=""
684         ERR="false"
685 )
686 stage $GO
687
688 GO=(
689     FUNC="expire"
690     TIME="expire_dumps"
691     ARGS=""
692     ERR=""
693 )
694 stage $GO
695
696 GO=(
697     FUNC="reports"
698     TIME="reports"
699     ARGS=""
700     ERR=""
701 )
702 stage $GO
703
704 GO=(
705     FUNC="dm"
706     TIME=""
707     ARGS=""
708     ERR=""
709 )
710 stage $GO
711
712 GO=(
713     FUNC="bts"
714     TIME=""
715     ARGS=""
716     ERR=""
717 )
718 stage $GO
719
720 GO=(
721     FUNC="merkel2"
722     TIME="merkel projectb push"
723     ARGS=""
724     ERR="false"
725 )
726 stage $GO
727
728 ulimit -m 90000 -d 90000 -s 10000 -v 200000
729
730 GO=(
731     FUNC="runparts"
732     TIME="run-parts"
733     ARGS=""
734     ERR="false"
735 )
736 stage $GO
737
738 GO=(
739     FUNC="i18n2"
740     TIME="i18n 2"
741     ARGS=""
742     ERR="false"
743 )
744 stage $GO
745
746 GO=(
747     FUNC="stats"
748     TIME="stats"
749     ARGS=""
750     ERR="false"
751 )
752 stage $GO
753
754 GO=(
755     FUNC="testingsourcelist"
756     TIME=""
757     ARGS=""
758     ERR="false"
759 )
760
761 rm -f ${LOCK_BRITNEY}
762
763 GO=(
764     FUNC="aptftpcleanup"
765     TIME="apt-ftparchive cleanup"
766     ARGS=""
767     ERR=""
768 )
769 stage $GO
770
771 GO=(
772     FUNC="compress"
773     TIME="compress"
774     ARGS=""
775     ERR=""
776 )
777 stage $GO
778
779 log "Daily cron scripts successful, all done"
780
781 exec > "$logdir/afterdinstall.log" 2>&1
782
783 cat "$LOGFILE" | mail -s "Log for dinstall run of ${NOW}" cron@ftp-master.debian.org
784
785 GO=(
786     FUNC="renamelogfile"
787     TIME=""
788     ARGS=""
789     ERR="false"
790 )
791 stage $GO
792
793
794 # Now, at the very (successful) end of dinstall, make sure we remove
795 # our stage files, so the next dinstall run will do it all again.
796 rm -f ${stagedir}/*
797 touch "${DINSTALLEND}"