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