]> git.decadent.org.uk Git - dak.git/blob - config/debian/dinstall.functions
Merge commit 'ftpmaster/master'
[dak.git] / config / debian / dinstall.functions
1 # Timestamp. Used for dinstall stat graphs
2 function ts() {
3         echo "Archive maintenance timestamp ($1): $(date +%H:%M:%S)"
4 }
5
6 # Cleanup actions
7 function cleanup() {
8         rm -f ${LOCK_DAILY}
9         rm -f ${LOCK_ACCEPTED}
10 }
11
12 # If we error out this one is called, *FOLLOWED* by cleanup above
13 function onerror() {
14     ERRDATE=$(date "+%Y.%m.%d-%H:%M:%S")
15
16     subject="ATTENTION ATTENTION!"
17     if [ "${error}" = "false" ]; then
18         subject="${subject} (continued)"
19     else
20         subject="${subject} (interrupted)"
21     fi
22     subject="${subject} dinstall error at ${ERRDATE} in ${STAGEFILE} - (Be quiet, Brain, or I'll stab you with a Q-tip)"
23
24     cat "${STAGEFILE}.log" | mail -s "${subject}" -a "X-Debian: DAK" cron@ftp-master.debian.org
25 }
26
27 ########################################################################
28 # the actual dinstall functions follow                                 #
29 ########################################################################
30
31 # pushing merkels QA user, part one
32 function merkel1() {
33     log "Telling merkels QA user that we start dinstall"
34     ssh -2 -i ~dak/.ssh/push_merkel_qa  -o BatchMode=yes -o SetupTimeOut=90 -o ConnectTimeout=90 qa@merkel.debian.org sleep 1
35 }
36
37 # Create the postgres dump files
38 function pgdump_pre() {
39     log "Creating pre-daily-cron-job backup of projectb database..."
40     pg_dump projectb > $base/backup/dump_pre_$(date +%Y.%m.%d-%H:%M:%S)
41 }
42
43 function pgdump_post() {
44     log "Creating post-daily-cron-job backup of projectb database..."
45     cd $base/backup
46     POSTDUMP=$(date +%Y.%m.%d-%H:%M:%S)
47     pg_dump projectb > $base/backup/dump_$POSTDUMP
48     pg_dumpall --globals-only > $base/backup/dumpall_$POSTDUMP
49     ln -sf $base/backup/dump_$POSTDUMP current
50     ln -sf $base/backup/dumpall_$POSTDUMP currentall
51 }
52
53 # Load the dak-dev projectb
54 function pgdakdev() {
55     cd $base/backup
56     echo "drop database projectb" | psql -p 5433 template1
57         cat currentall | psql -p 5433 template1
58     createdb -p 5433 -T template0 projectb
59     fgrep -v '\connect' current | psql -p 5433 projectb
60 }
61
62 # Updating various files
63 function updates() {
64     log "Updating Bugs docu, Mirror list and mailing-lists.txt"
65     cd $configdir
66     $scriptsdir/update-bugdoctxt
67     $scriptsdir/update-mirrorlists
68     $scriptsdir/update-mailingliststxt
69     $scriptsdir/update-pseudopackages.sh
70 }
71
72 # Process (oldstable)-proposed-updates "NEW" queue
73 function punew_do() {
74     cd "${queuedir}/${1}"
75     date -u -R >> REPORT
76     dak process-new -a -C COMMENTS >> REPORT || true
77     echo >> REPORT
78 }
79 function punew() {
80     log "Doing automated p-u-new processing"
81     punew_do "$1"
82 }
83 function opunew() {
84     log "Doing automated o-p-u-new processing"
85     punew_do "$1"
86 }
87
88 # The first i18n one, syncing new descriptions
89 function i18n1() {
90     log "Synchronizing i18n package descriptions"
91     # First sync their newest data
92     cd ${scriptdir}/i18nsync
93     rsync -aq --delete --delete-after ddtp-sync:/does/not/matter . || true
94
95     # Now check if we still know about the packages for which they created the files
96     # is the timestamp signed by us?
97     if $(gpgv --keyring /srv/ftp.debian.org/s3kr1t/dot-gnupg/pubring.gpg timestamp.gpg timestamp); then
98         # now read it. As its signed by us we are sure the content is what we expect, no need
99         # to do more here. And we only test -d a directory on it anyway.
100         TSTAMP=$(cat timestamp)
101         # do we have the dir still?
102         if [ -d ${scriptdir}/i18n/${TSTAMP} ]; then
103             # Lets check!
104             if ${scriptsdir}/ddtp-i18n-check.sh . ${scriptdir}/i18n/${TSTAMP}; then
105                 # Yay, worked, lets copy around
106                 for dir in squeeze sid; do
107                     if [ -d dists/${dir}/ ]; then
108                         cd dists/${dir}/main/i18n
109                         rsync -aq --delete --delete-after  . ${ftpdir}/dists/${dir}/main/i18n/.
110                     fi
111                     cd ${scriptdir}/i18nsync
112                 done
113             else
114                 echo "ARRRR, bad guys, wrong files, ARRR"
115                 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
116             fi
117         else
118             echo "ARRRR, missing the timestamp ${TSTAMP} directory, not updating i18n, ARRR"
119             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
120         fi
121     else
122         echo "ARRRRRRR, could not verify our timestamp signature, ARRR. Don't mess with our files, i18n guys, ARRRRR."
123         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
124     fi
125 }
126
127 function cruft() {
128     log "Checking for cruft in overrides"
129     dak check-overrides
130 }
131
132 function msfl() {
133     log "Generating suite file lists for apt-ftparchive"
134     dak make-suite-file-list
135 }
136
137 function fingerprints() {
138     log "Not updating fingerprints - scripts needs checking"
139
140 #    log "Updating fingerprints"
141 #    dak import-keyring -L /srv/keyring.debian.org/keyrings/debian-keyring.gpg
142
143 #    OUTFILE=$(mktemp)
144 #    dak import-keyring --generate-users "%s" /srv/keyring.debian.org/keyrings/debian-maintainers.gpg >"${OUTFILE}"
145
146 #    if [ -s "${OUTFILE}" ]; then
147 #        /usr/sbin/sendmail -odq -oi -t -f envelope@ftp-master.debian.org <<EOF
148 #From: Debian FTP Masters <ftpmaster@ftp-master.debian.org>
149 #To: <debian-project@lists.debian.org>
150 #Subject: Debian Maintainers Keyring changes
151 #Content-Type: text/plain; charset=utf-8
152 #MIME-Version: 1.0
153 #
154 #The following changes to the debian-maintainers keyring have just been activated:
155 #
156 #$(cat $OUTFILE)
157 #
158 #Debian distribution maintenance software,
159 #on behalf of the Keyring maintainers
160 #
161 #EOF
162 #    fi
163 #    rm -f "$OUTFILE"
164 }
165
166 function overrides() {
167     log "Writing overrides into text files"
168     cd $overridedir
169     dak make-overrides
170
171     # FIXME
172     rm -f override.sid.all3
173     for i in main contrib non-free main.debian-installer; do cat override.sid.$i >> override.sid.all3; done
174 }
175
176 function mpfm() {
177     log "Generating package / file mapping"
178     dak make-pkg-file-mapping | bzip2 -9 > $base/ftp/indices/package-file.map.bz2
179 }
180
181 function packages() {
182     log "Generating Packages and Sources files"
183     cd $configdir
184     GZIP='--rsyncable' ; export GZIP
185     apt-ftparchive generate apt.conf
186 }
187
188 function pdiff() {
189     log "Generating pdiff files"
190     dak generate-index-diffs
191 }
192
193 function release() {
194     log "Generating Release files"
195     dak generate-releases
196 }
197
198 function dakcleanup() {
199     log "Cleanup old packages/files"
200     dak clean-suites -m 10000
201     dak clean-queues
202 }
203
204 function buildd() {
205     # Needs to be rebuilt, as files have moved.  Due to unaccepts, we need to
206     # update this before wanna-build is updated.
207     log "Regenerating wanna-build/buildd information"
208     psql projectb -A -t -q -c "SELECT build_queue.path || '/' || build_queue_files.filename FROM build_queue_files LEFT JOIN build_queue ON (build_queue.id =build_queue_files.build_queue_id) WHERE queue_name = 'buildd' AND filename ~ 'd(sc|eb)$'"  > $dbdir/dists/unstable_accepted.list
209     symlinks -d /srv/incoming.debian.org/buildd > /dev/null
210     apt-ftparchive generate apt.conf.buildd
211 }
212
213 function buildd_dir() {
214     # Rebuilt the buildd dir to avoid long times of 403
215     log "Regenerating the buildd incoming dir"
216     STAMP=$(date "+%Y%m%d%H%M")
217     make_buildd_dir
218 }
219
220 function mklslar() {
221     cd $ftpdir
222
223     FILENAME=ls-lR
224
225     log "Removing any core files ..."
226     find -type f -name core -print0 | xargs -0r rm -v
227
228     log "Checking permissions on files in the FTP tree ..."
229     find -type f \( \! -perm -444 -o -perm +002 \) -ls
230     find -type d \( \! -perm -555 -o -perm +002 \) -ls
231
232     log "Checking symlinks ..."
233     symlinks -rd .
234
235     log "Creating recursive directory listing ... "
236     rm -f .${FILENAME}.new
237     TZ=UTC ls -lR > .${FILENAME}.new
238
239     if [ -r ${FILENAME}.gz ] ; then
240         mv -f ${FILENAME}.gz ${FILENAME}.old.gz
241         mv -f .${FILENAME}.new ${FILENAME}
242         rm -f ${FILENAME}.patch.gz
243         zcat ${FILENAME}.old.gz | diff -u - ${FILENAME} | gzip --rsyncable -9cfn - >${FILENAME}.patch.gz
244         rm -f ${FILENAME}.old.gz
245     else
246         mv -f .${FILENAME}.new ${FILENAME}
247     fi
248
249     gzip --rsyncable -9cfN ${FILENAME} >${FILENAME}.gz
250     rm -f ${FILENAME}
251 }
252
253 function mkmaintainers() {
254     log -n 'Creating Maintainers index ... '
255
256     cd $indices
257     dak make-maintainers ${scriptdir}/masterfiles/pseudo-packages.maintainers | \
258         sed -e "s/~[^  ]*\([   ]\)/\1/"  | awk '{printf "%-20s ", $1; for (i=2; i<=NF; i++) printf "%s ", $i; printf "\n";}' > .new-maintainers
259
260     set +e
261     cmp .new-maintainers Maintainers >/dev/null
262     rc=$?
263     set -e
264     if [ $rc = 1 ] || [ ! -f Maintainers ] ; then
265             log -n "installing Maintainers ... "
266             mv -f .new-maintainers Maintainers
267             gzip --rsyncable -9v <Maintainers >.new-maintainers.gz
268             mv -f .new-maintainers.gz Maintainers.gz
269     elif [ $rc = 0 ] ; then
270             log '(same as before)'
271             rm -f .new-maintainers
272     else
273             log cmp returned $rc
274             false
275     fi
276 }
277
278 function copyoverrides() {
279     log 'Copying override files into public view ...'
280
281     for f in $copyoverrides ; do
282             cd $overridedir
283             chmod g+w override.$f
284
285             cd $indices
286             rm -f .newover-$f.gz
287             pc="`gzip 2>&1 -9nv <$overridedir/override.$f >.newover-$f.gz`"
288             set +e
289             nf=override.$f.gz
290             cmp -s .newover-$f.gz $nf
291             rc=$?
292             set -e
293         if [ $rc = 0 ]; then
294                     rm -f .newover-$f.gz
295             elif [ $rc = 1 -o ! -f $nf ]; then
296                     log "   installing new $nf $pc"
297                     mv -f .newover-$f.gz $nf
298                     chmod g+w $nf
299             else
300                     log $? $pc
301                     exit 1
302             fi
303     done
304 }
305
306 function mkfilesindices() {
307     umask 002
308     cd $base/ftp/indices/files/components
309
310     ARCHLIST=$(tempfile)
311
312     log "Querying projectb..."
313     echo 'SELECT l.path, f.filename, a.arch_string FROM location l JOIN files f ON (f.location = l.id) LEFT OUTER JOIN (binaries b JOIN architecture a ON (b.architecture = a.id)) ON (f.id = b.file)' | psql projectb -At | sed 's/|//;s,^/srv/ftp.debian.org/ftp,.,' | sort >$ARCHLIST
314
315     includedirs () {
316         perl -ne 'print; while (m,/[^/]+$,) { $_=$`; print $_ . "\n" unless $d{$_}++; }'
317     }
318     poolfirst () {
319         perl -e '@nonpool=(); while (<>) { if (m,^\./pool/,) { print; } else { push @nonpool, $_; } } print for (@nonpool);'
320     }
321
322     log "Generating sources list
323     (
324         sed -n 's/|$//p' $ARCHLIST
325         cd $base/ftp
326         find ./dists -maxdepth 1 \! -type d
327         find ./dists \! -type d | grep "/source/"
328     ) | sort -u | gzip --rsyncable -9 > source.list.gz
329
330     log "Generating arch lists
331
332     ARCHES=$( (<$ARCHLIST sed -n 's/^.*|//p'; echo amd64) | grep . | grep -v all | sort -u)
333     for a in $ARCHES; do
334         (sed -n "s/|$a$//p" $ARCHLIST
335             sed -n 's/|all$//p' $ARCHLIST
336
337             cd $base/ftp
338             find ./dists -maxdepth 1 \! -type d
339             find ./dists \! -type d | grep -E "(proposed-updates.*_$a.changes$|/main/disks-$a/|/main/installer-$a/|/Contents-$a|/binary-$a/)"
340         ) | sort -u | gzip --rsyncable -9 > arch-$a.list.gz
341     done
342
343     log "Generating suite lists"
344
345     suite_list () {
346         printf 'SELECT DISTINCT l.path, f.filename FROM (SELECT sa.source AS source FROM src_associations sa WHERE sa.suite = %d UNION SELECT b.source AS source FROM bin_associations ba JOIN binaries b ON (ba.bin = b.id) WHERE ba.suite = %d) s JOIN dsc_files df ON (s.source = df.source) JOIN files f ON (df.file = f.id) JOIN location l ON (f.location = l.id)\n' $1 $1 | psql -F' ' -A -t projectb
347
348         printf 'SELECT l.path, f.filename FROM bin_associations ba JOIN binaries b ON (ba.bin = b.id) JOIN files f ON (b.file = f.id) JOIN location l ON (f.location = l.id) WHERE ba.suite = %d\n' $1 | psql -F' ' -A -t projectb
349     }
350
351     printf 'SELECT id, suite_name FROM suite\n' | psql -F' ' -At projectb |
352     while read id suite; do
353         [ -e $base/ftp/dists/$suite ] || continue
354         (
355             (cd $base/ftp
356                 distname=$(cd dists; readlink $suite || echo $suite)
357                 find ./dists/$distname \! -type d
358                 for distdir in ./dists/*; do
359                     [ "$(readlink $distdir)" != "$distname" ] || echo $distdir
360                 done
361             )
362             suite_list $id | tr -d ' ' | sed 's,^/srv/ftp.debian.org/ftp,.,'
363         ) | sort -u | gzip --rsyncable -9 > suite-${suite}.list.gz
364     done
365
366     log "Finding everything on the ftp site to generate sundries"
367
368     (cd $base/ftp; find . \! -type d \! -name 'Archive_Maintenance_In_Progress' | sort) >$ARCHLIST
369
370     rm -f sundries.list
371     zcat *.list.gz | cat - *.list | sort -u |
372     diff - $ARCHLIST | sed -n 's/^> //p' > sundries.list
373
374     log "Generating files list"
375
376     for a in $ARCHES; do
377         (echo ./project/trace; zcat arch-$a.list.gz source.list.gz) |
378         cat - sundries.list dists.list project.list docs.list indices.list |
379         sort -u | poolfirst > ../arch-$a.files
380     done
381
382     (cd $base/ftp/
383             for dist in sid squeeze; do
384                     find ./dists/$dist/main/i18n/ \! -type d | sort -u | gzip --rsyncable -9 > $base/ftp/indices/files/components/translation-$dist.list.gz
385             done
386     )
387
388     (cat ../arch-i386.files ../arch-amd64.files; zcat suite-oldstable.list.gz suite-proposed-updates.list.gz ; zcat translation-sid.list.gz ; zcat translation-squeeze.list.gz) |
389     sort -u | poolfirst > ../typical.files
390
391     rm -f $ARCHLIST
392     log "Done!"
393 }
394
395 function mkchecksums() {
396     dsynclist=$dbdir/dsync.list
397     md5list=$indices/md5sums
398
399     log -n "Creating md5 / dsync index file ... "
400
401     cd "$ftpdir"
402     ${bindir}/dsync-flist -q generate $dsynclist --exclude $dsynclist --md5
403     ${bindir}/dsync-flist -q md5sums $dsynclist | gzip -9n --rsyncable > ${md5list}.gz
404     ${bindir}/dsync-flist -q link-dups $dsynclist || true
405 }
406
407 function scripts() {
408     log "Running various scripts from $scriptsdir"
409     mkmaintainers
410     copyoverrides
411     mklslar
412     mkfilesindices
413     mkchecksums
414 }
415
416 function mirror() {
417     log "Regenerating \"public\" mirror/ hardlink fun"
418     cd ${mirrordir}
419     rsync -aH --link-dest ${ftpdir} --delete --delete-after --ignore-errors ${ftpdir}/. .
420 }
421
422 function wb() {
423     log "Trigger daily wanna-build run"
424     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
425 }
426
427 function expire() {
428     log "Expiring old database dumps..."
429     cd $base/backup
430     $scriptsdir/expire_dumps -d . -p -f "dump_*"
431 }
432
433 function transitionsclean() {
434     log "Removing out of date transitions..."
435     cd $base
436     dak transitions -c -a
437 }
438
439 function reports() {
440     # Send a report on NEW/BYHAND packages
441     log "Nagging ftpteam about NEW/BYHAND packages"
442     dak queue-report | mail -e -s "NEW and BYHAND on $(date +%D)" ftpmaster@ftp-master.debian.org
443     # and one on crufty packages
444     log "Sending information about crufty packages"
445     dak cruft-report > $webdir/cruft-report-daily.txt
446     dak cruft-report -s experimental >> $webdir/cruft-report-daily.txt
447     cat $webdir/cruft-report-daily.txt | mail -e -s "Debian archive cruft report for $(date +%D)" ftpmaster@ftp-master.debian.org
448 }
449
450 function dm() {
451     log "Updating DM html page"
452     $scriptsdir/dm-monitor >$webdir/dm-uploaders.html
453 }
454
455 function bts() {
456     log "Categorizing uncategorized bugs filed against ftp.debian.org"
457     dak bts-categorize
458 }
459
460 function merkel2() {
461     # Push dak@merkel so it syncs the projectb there. Returns immediately, the sync runs detached
462     log "Trigger merkel/flotows projectb sync"
463     ssh -2 -o BatchMode=yes -o SetupTimeOut=30 -o ConnectTimeout=30 -i ~/.ssh/push_merkel_projectb dak@merkel.debian.org sleep 1
464     # Also trigger flotow, the ftpmaster test box
465     ssh -2 -o BatchMode=yes -o SetupTimeOut=30 -o ConnectTimeout=30 -i ~/.ssh/push_flotow_projectb dak@flotow.debconf.org sleep 1
466 }
467
468 function merkel3() {
469     # Push dak@merkel to tell it to sync the dd accessible parts. Returns immediately, the sync runs detached
470     log "Trigger merkels dd accessible parts sync"
471     ssh -2 -o BatchMode=yes -o SetupTimeOut=30 -o ConnectTimeout=30 -i ~/.ssh/push_merkel_ddaccess dak@merkel.debian.org sleep 1
472 }
473
474 function mirrorpush() {
475     log "Starting the mirrorpush"
476     date -u > /srv/ftp.debian.org/web/mirrorstart
477     echo "Using dak v1" >> /srv/ftp.debian.org/web/mirrorstart
478     echo "Running on host $(hostname -f)" >> /srv/ftp.debian.org/web/mirrorstart
479     sudo -H -u archvsync /home/archvsync/runmirrors > ~dak/runmirrors.log 2>&1 &
480 }
481
482 function i18n2() {
483     log "Exporting package data foo for i18n project"
484     STAMP=$(date "+%Y%m%d%H%M")
485     mkdir -p ${scriptdir}/i18n/${STAMP}
486     cd ${scriptdir}/i18n/${STAMP}
487     dak control-suite -l stable > lenny
488     dak control-suite -l testing > squeeze
489     dak control-suite -l unstable > sid
490     echo "${STAMP}" > timestamp
491     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
492     rm -f md5sum
493     md5sum * > md5sum
494     cd ${webdir}/
495     ln -sfT ${scriptdir}/i18n/${STAMP} i18n
496
497     cd ${scriptdir}
498     find ./i18n -mindepth 1 -maxdepth 1 -mtime +2 -not -name "${STAMP}" -type d -print0 | xargs --no-run-if-empty -0 rm -rf
499 }
500
501 function stats() {
502     log "Updating stats data"
503     cd $configdir
504     $scriptsdir/update-ftpstats $base/log/* > $base/misc/ftpstats.data
505     R --slave --vanilla < $base/misc/ftpstats.R
506     dak stats arch-space > $webdir/arch-space
507     dak stats pkg-nums > $webdir/pkg-nums
508 }
509
510 function aptftpcleanup() {
511     log "Clean up apt-ftparchive's databases"
512     cd $configdir
513     apt-ftparchive -q clean apt.conf
514 }
515
516 function compress() {
517     log "Compress old psql backups"
518     cd $base/backup/
519     find -maxdepth 1 -mindepth 1 -type f -name 'dump_pre_*' -mtime +2 -print0 | xargs -0 --no-run-if-empty rm
520
521     find -maxdepth 1 -mindepth 1 -type f -name 'dump_*' \! -name '*.bz2' \! -name '*.gz' -mmin +720 |
522     while read dumpname; do
523         echo "Compressing $dumpname"
524         bzip2 -9fv "$dumpname"
525     done
526     find -maxdepth 1 -mindepth 1 -type f -name "dumpall_*" \! -name '*.bz2' \! -name '*.gz' -mmin +720 |
527     while read dumpname; do
528         echo "Compressing $dumpname"
529         bzip2 -9fv "$dumpname"
530     done
531     finddup -l -d $base/backup
532 }
533
534 function logstats() {
535     $masterdir/tools/logs.py "$1"
536 }
537
538 # save timestamp when we start
539 function savetimestamp() {
540         NOW=`date "+%Y.%m.%d-%H:%M:%S"`
541         echo ${NOW} > "${dbdir}/dinstallstart"
542 }
543
544 function maillogfile() {
545     cat "$LOGFILE" | mail -s "Log for dinstall run of ${NOW}" cron@ftp-master.debian.org
546 }
547
548 function renamelogfile() {
549     if [ -f "${dbdir}/dinstallstart" ]; then
550         NOW=$(cat "${dbdir}/dinstallstart")
551 #        maillogfile
552         mv "$LOGFILE" "$logdir/dinstall_${NOW}.log"
553         logstats "$logdir/dinstall_${NOW}.log"
554         bzip2 -9 "$logdir/dinstall_${NOW}.log"
555     else
556         error "Problem, I don't know when dinstall started, unable to do log statistics."
557         NOW=`date "+%Y.%m.%d-%H:%M:%S"`
558 #        maillogfile
559         mv "$LOGFILE" "$logdir/dinstall_${NOW}.log"
560         bzip2 -9 "$logdir/dinstall_${NOW}.log"
561     fi
562 }
563
564 function testingsourcelist() {
565     dak ls -s testing -f heidi -r .| egrep 'source$' > ${webdir}/testing.list
566 }
567
568 # do a last run of process-unchecked before dinstall is on.
569 function process_unchecked() {
570     log "Processing the unchecked queue"
571     UNCHECKED_WITHOUT_LOCK="-p"
572     do_unchecked
573     sync_debbugs
574 }