]> git.decadent.org.uk Git - dak.git/blob - config/debian/dinstall.functions
Merge branch 'typofix'
[dak.git] / config / debian / dinstall.functions
1 # -*- mode:sh -*-
2 # Timestamp. Used for dinstall stat graphs
3 function ts() {
4         echo "Archive maintenance timestamp ($1): $(date +%H:%M:%S)"
5 }
6
7 # Cleanup actions
8 function cleanup() {
9         rm -f ${LOCK_DAILY}
10         rm -f ${LOCK_ACCEPTED}
11 }
12
13 # If we error out this one is called, *FOLLOWED* by cleanup above
14 function onerror() {
15     ERRDATE=$(date "+%Y.%m.%d-%H:%M:%S")
16
17     subject="ATTENTION ATTENTION!"
18     if [ "${error}" = "false" ]; then
19         subject="${subject} (continued)"
20     else
21         subject="${subject} (interrupted)"
22     fi
23     subject="${subject} dinstall error at ${ERRDATE} in ${STAGEFILE} - (Be quiet, Brain, or I'll stab you with a Q-tip)"
24
25     cat "${STAGEFILE}.log" | mail -s "${subject}" -a "X-Debian: DAK" cron@ftp-master.debian.org -- -F "Debian FTP Masters" -f ftpmaster@ftp-master.debian.org
26 }
27
28 ########################################################################
29 # the actual dinstall functions follow                                 #
30 ########################################################################
31
32 # pushing merkels QA user, part one
33 function merkel1() {
34     log "Telling merkels QA user that we start dinstall"
35     ssh -2 -i ~dak/.ssh/push_merkel_qa  -o BatchMode=yes -o SetupTimeOut=90 -o ConnectTimeout=90 qa@qa.debian.org sleep 1
36 }
37
38 # Create the postgres dump files
39 function pgdump_pre() {
40     log "Creating pre-daily-cron-job backup of $PGDATABASE database..."
41     pg_dump > $base/backup/dump_pre_$(date +%Y.%m.%d-%H:%M:%S)
42 }
43
44 function pgdump_post() {
45     log "Creating post-daily-cron-job backup of $PGDATABASE database..."
46     cd $base/backup
47     POSTDUMP=$(date +%Y.%m.%d-%H:%M:%S)
48     pg_dump > $base/backup/dump_$POSTDUMP
49     #pg_dumpall --globals-only > $base/backup/dumpall_$POSTDUMP
50     ln -sf $base/backup/dump_$POSTDUMP current
51     #ln -sf $base/backup/dumpall_$POSTDUMP currentall
52 }
53
54 # Load the dak-dev projectb
55 function pgdakdev() {
56     # Make sure to unset any possible psql variables so we don't drop the wrong
57     # f****** database by accident
58     local PGDATABASE
59     unset PGDATABASE
60     local PGHOST
61     unset PGHOST
62     local PGPORT
63     unset PGPORT
64     local PGUSER
65     unset PGUSER
66     cd $base/backup
67     echo "drop database projectb" | psql -p 5434 template1
68         #cat currentall | psql -p 5433 template1
69     createdb -p 5434 -T template1 projectb
70     fgrep -v '\connect' current | psql -p 5434 projectb
71 }
72
73 # Updating various files
74 function updates() {
75     log "Updating Bugs docu, Mirror list and mailing-lists.txt"
76     cd $configdir
77     $scriptsdir/update-bugdoctxt
78     $scriptsdir/update-mirrorlists
79     $scriptsdir/update-mailingliststxt
80     $scriptsdir/update-pseudopackages.sh
81 }
82
83 # Process (oldstable)-proposed-updates "NEW" queue
84 function punew_do() {
85     date -u -R >> REPORT
86     dak process-policy $1 | tee -a REPORT | mail -a "X-Debian: DAK" -e -s "NEW changes in $1" debian-release@lists.debian.org -- -F "Debian FTP Masters" -f ftpmaster@ftp-master.debian.org
87     echo >> REPORT
88 }
89 function punew() {
90     log "Doing automated p-u-new processing"
91     cd "${queuedir}/p-u-new"
92     punew_do "$1"
93 }
94 function opunew() {
95     log "Doing automated o-p-u-new processing"
96     cd "${queuedir}/o-p-u-new"
97     punew_do "$1"
98 }
99
100 # The first i18n one, syncing new descriptions
101 function i18n1() {
102     log "Synchronizing i18n package descriptions"
103     # First sync their newest data
104     cd ${scriptdir}/i18nsync
105     rsync -aq --delete --delete-after ddtp-sync:/does/not/matter . || true
106
107     # Now check if we still know about the packages for which they created the files
108     # is the timestamp signed by us?
109     if $(gpgv --keyring /srv/ftp-master.debian.org/s3kr1t/dot-gnupg/pubring.gpg timestamp.gpg timestamp); then
110         # now read it. As its signed by us we are sure the content is what we expect, no need
111         # to do more here. And we only test -d a directory on it anyway.
112         TSTAMP=$(cat timestamp)
113         # do we have the dir still?
114         if [ -d ${scriptdir}/i18n/${TSTAMP} ]; then
115             # Lets check!
116             if ${scriptsdir}/ddtp-i18n-check.sh . ${scriptdir}/i18n/${TSTAMP}; then
117                 # Yay, worked, lets copy around
118                 for dir in squeeze sid; do
119                     if [ -d dists/${dir}/ ]; then
120                         cd dists/${dir}/main/i18n
121                         rsync -aq --delete --delete-after  . ${ftpdir}/dists/${dir}/main/i18n/.
122                     fi
123                     cd ${scriptdir}/i18nsync
124                 done
125             else
126                 echo "ARRRR, bad guys, wrong files, ARRR"
127                 echo "Arf, Arf, Arf, bad guys, wrong files, arf, arf, arf" | mail -a "X-Debian: DAK" -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 -- -F "Debian FTP Masters" -f ftpmaster@ftp-master.debian.org
128             fi
129         else
130             echo "ARRRR, missing the timestamp ${TSTAMP} directory, not updating i18n, ARRR"
131             echo "Arf, Arf, Arf, missing the timestamp ${TSTAMP} directory, not updating i18n, arf, arf, arf" | mail -a "X-Debian: DAK" -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 -- -F "Debian FTP Masters" -f ftpmaster@ftp-master.debian.org
132         fi
133     else
134         echo "ARRRRRRR, could not verify our timestamp signature, ARRR. Don't mess with our files, i18n guys, ARRRRR."
135         echo "Arf, Arf, Arf, could not verify our timestamp signature, arf. Don't mess with our files, i18n guys, arf, arf, arf" | mail -a "X-Debian: DAK" -s "You can't keep blaming yourself. Just blame yourself once, and move on." debian-l10n-devel@lists.alioth.debian.org -- -F "Debian FTP Masters" -f ftpmaster@ftp-master.debian.org
136     fi
137 }
138
139 function cruft() {
140     log "Checking for cruft in overrides"
141     dak check-overrides
142 }
143
144 function dominate() {
145     log "Removing obsolete source and binary associations"
146     dak dominate
147 }
148
149 function filelist() {
150     log "Generating file lists for apt-ftparchive"
151     dak generate-filelist
152 }
153
154 function fingerprints() {
155     log "Not updating fingerprints - scripts needs checking"
156
157     log "Updating fingerprints"
158     dak import-keyring -L /srv/keyring.debian.org/keyrings/debian-keyring.gpg
159
160     OUTFILE=$(mktemp)
161     dak import-keyring --generate-users "%s" /srv/keyring.debian.org/keyrings/debian-maintainers.gpg >"${OUTFILE}"
162
163     if [ -s "${OUTFILE}" ]; then
164         /usr/sbin/sendmail -odq -oi -t -f envelope@ftp-master.debian.org <<EOF
165 From: Debian FTP Masters <ftpmaster@ftp-master.debian.org>
166 To: <debian-project@lists.debian.org>
167 Subject: Debian Maintainers Keyring changes
168 Content-Type: text/plain; charset=utf-8
169 X-Debian: DAK
170 MIME-Version: 1.0
171
172 The following changes to the debian-maintainers keyring have just been activated:
173
174 $(cat $OUTFILE)
175
176 Debian distribution maintenance software,
177 on behalf of the Keyring maintainers
178
179 EOF
180     fi
181     rm -f "$OUTFILE"
182 }
183
184 function overrides() {
185     log "Writing overrides into text files"
186     cd $overridedir
187     dak make-overrides
188
189     # FIXME
190     rm -f override.sid.all3
191     for i in main contrib non-free main.debian-installer; do cat override.sid.$i >> override.sid.all3; done
192 }
193
194 function mpfm() {
195     log "Generating package / file mapping"
196     dak make-pkg-file-mapping | bzip2 -9 > $base/ftp/indices/package-file.map.bz2
197 }
198
199 function packages() {
200     log "Generating Packages and Sources files"
201     cd $configdir
202     GZIP='--rsyncable' ; export GZIP
203     #apt-ftparchive generate apt.conf
204     dak generate-packages-sources
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 -m 10000
220     dak clean-queues
221 }
222
223 function buildd_dir() {
224     # Rebuilt the buildd dir to avoid long times of 403
225     log "Regenerating the buildd incoming dir"
226     STAMP=$(date "+%Y%m%d%H%M")
227     make_buildd_dir
228 }
229
230 function mklslar() {
231     cd $ftpdir
232
233     FILENAME=ls-lR
234
235     log "Removing any core files ..."
236     find -type f -name core -print0 | xargs -0r rm -v
237
238     log "Checking permissions on files in the FTP tree ..."
239     find -type f \( \! -perm -444 -o -perm +002 \) -ls
240     find -type d \( \! -perm -555 -o -perm +002 \) -ls
241
242     log "Checking symlinks ..."
243     symlinks -rd .
244
245     log "Creating recursive directory listing ... "
246     rm -f .${FILENAME}.new
247     TZ=UTC ls -lR > .${FILENAME}.new
248
249     if [ -r ${FILENAME}.gz ] ; then
250         mv -f ${FILENAME}.gz ${FILENAME}.old.gz
251         mv -f .${FILENAME}.new ${FILENAME}
252         rm -f ${FILENAME}.patch.gz
253         zcat ${FILENAME}.old.gz | diff -u - ${FILENAME} | gzip --rsyncable -9cfn - >${FILENAME}.patch.gz
254         rm -f ${FILENAME}.old.gz
255     else
256         mv -f .${FILENAME}.new ${FILENAME}
257     fi
258
259     gzip --rsyncable -9cfN ${FILENAME} >${FILENAME}.gz
260     rm -f ${FILENAME}
261 }
262
263 function mkmaintainers() {
264     log 'Creating Maintainers index ... '
265
266     cd $indices
267     dak make-maintainers ${scriptdir}/masterfiles/pseudo-packages.maintainers | \
268         sed -e "s/~[^  ]*\([   ]\)/\1/"  | \
269         awk '{printf "%-20s ", $1; for (i=2; i<=NF; i++) printf "%s ", $i; printf "\n";}' > .new-maintainers
270
271     if ! cmp -s .new-maintainers Maintainers || [ ! -f Maintainers ]; then
272             log "installing Maintainers ... "
273             mv -f .new-maintainers Maintainers
274             gzip --rsyncable -9v <Maintainers >.new-maintainers.gz
275             mv -f .new-maintainers.gz Maintainers.gz
276     else
277         rm -f .new-maintainers
278     fi
279 }
280
281 function mkuploaders() {
282     log 'Creating Uploaders index ... '
283
284     cd $indices
285     dak make-maintainers -u ${scriptdir}/masterfiles/pseudo-packages.maintainers | \
286         sed -e "s/~[^  ]*\([   ]\)/\1/"  | \
287         awk '{printf "%-20s ", $1; for (i=2; i<=NF; i++) printf "%s ", $i; printf "\n";}' > .new-uploaders
288
289     if ! cmp -s .new-uploaders Uploaders || [ ! -f Uploaders ]; then
290             log "installing Uploaders ... "
291             mv -f .new-uploaders Uploaders
292             gzip --rsyncable -9v <Uploaders >.new-uploaders.gz
293             mv -f .new-uploaders.gz Uploaders.gz
294     else
295         rm -f .new-uploaders
296     fi
297 }
298
299 function copyoverrides() {
300     log 'Copying override files into public view ...'
301
302     for ofile in $copyoverrides ; do
303             cd $overridedir
304             chmod g+w override.$ofile
305
306             cd $indices
307
308             newofile=override.$ofile.gz
309             rm -f .newover-$ofile.gz
310             pc="`gzip 2>&1 -9nv <$overridedir/override.$ofile >.newover-$ofile.gz`"
311         if ! cmp -s .newover-$ofile.gz $newofile || [ ! -f $newofile ]; then
312                     log "   installing new $newofile $pc"
313                     mv -f .newover-$ofile.gz $newofile
314                     chmod g+w $newofile
315         else
316                     rm -f .newover-$ofile.gz
317             fi
318     done
319 }
320
321 function mkfilesindices() {
322     umask 002
323     cd $base/ftp/indices/files/components
324
325     ARCHLIST=$(tempfile)
326
327     log "Querying $PGDATABASE..."
328     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 -At | sed 's/|//;s,^/srv/ftp-master.debian.org/ftp,.,' | sort >$ARCHLIST
329
330     includedirs () {
331         perl -ne 'print; while (m,/[^/]+$,) { $_=$`; print $_ . "\n" unless $d{$_}++; }'
332     }
333     poolfirst () {
334         perl -e '@nonpool=(); while (<>) { if (m,^\./pool/,) { print; } else { push @nonpool, $_; } } print for (@nonpool);'
335     }
336
337     log "Generating sources list"
338     (
339         sed -n 's/|$//p' $ARCHLIST
340         cd $base/ftp
341         find ./dists -maxdepth 1 \! -type d
342         find ./dists \! -type d | grep "/source/"
343     ) | sort -u | gzip --rsyncable -9 > source.list.gz
344
345     log "Generating arch lists"
346
347     ARCHES=$( (<$ARCHLIST sed -n 's/^.*|//p'; echo amd64) | grep . | grep -v all | sort -u)
348     for a in $ARCHES; do
349         (sed -n "s/|$a$//p" $ARCHLIST
350             sed -n 's/|all$//p' $ARCHLIST
351
352             cd $base/ftp
353             find ./dists -maxdepth 1 \! -type d
354             find ./dists \! -type d | grep -E "(proposed-updates.*_$a.changes$|/main/disks-$a/|/main/installer-$a/|/Contents-$a|/binary-$a/)"
355         ) | sort -u | gzip --rsyncable -9 > arch-$a.list.gz
356     done
357
358     log "Generating suite lists"
359
360     suite_list () {
361         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
362
363         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
364     }
365
366     printf 'SELECT id, suite_name FROM suite\n' | psql -F' ' -At |
367     while read id suite; do
368         [ -e $base/ftp/dists/$suite ] || continue
369         (
370             (cd $base/ftp
371                 distname=$(cd dists; readlink $suite || echo $suite)
372                 find ./dists/$distname \! -type d
373                 for distdir in ./dists/*; do
374                     [ "$(readlink $distdir)" != "$distname" ] || echo $distdir
375                 done
376             )
377             suite_list $id | tr -d ' ' | sed 's,^/srv/ftp-master.debian.org/ftp,.,'
378         ) | sort -u | gzip --rsyncable -9 > suite-${suite}.list.gz
379     done
380
381     log "Finding everything on the ftp site to generate sundries"
382     (cd $base/ftp; find . \! -type d \! -name 'Archive_Maintenance_In_Progress' | sort) >$ARCHLIST
383
384     rm -f sundries.list
385     zcat *.list.gz | cat - *.list | sort -u |
386     diff - $ARCHLIST | sed -n 's/^> //p' > sundries.list
387
388     log "Generating files list"
389
390     for a in $ARCHES; do
391         (echo ./project/trace; zcat arch-$a.list.gz source.list.gz) |
392         cat - sundries.list dists.list project.list docs.list indices.list |
393         sort -u | poolfirst > ../arch-$a.files
394     done
395
396     (cd $base/ftp/
397             for dist in sid squeeze; do
398                     find ./dists/$dist/main/i18n/ \! -type d | sort -u | gzip --rsyncable -9 > $base/ftp/indices/files/components/translation-$dist.list.gz
399             done
400     )
401
402     (cat ../arch-i386.files ../arch-amd64.files; zcat suite-proposed-updates.list.gz ; zcat translation-sid.list.gz ; zcat translation-squeeze.list.gz) |
403     sort -u | poolfirst > ../typical.files
404
405     rm -f $ARCHLIST
406     log "Done!"
407 }
408
409 function mkchecksums() {
410     dsynclist=$dbdir/dsync.list
411     md5list=$indices/md5sums
412
413     log -n "Creating md5 / dsync index file ... "
414
415     cd "$ftpdir"
416     ${bindir}/dsync-flist -q generate $dsynclist --exclude $dsynclist --md5
417     ${bindir}/dsync-flist -q md5sums $dsynclist | gzip -9n --rsyncable > ${md5list}.gz
418     ${bindir}/dsync-flist -q link-dups $dsynclist || true
419 }
420
421 function mirror() {
422     log "Regenerating \"public\" mirror/ hardlink fun"
423     DATE_SERIAL=$(date +"%Y%m%d01")
424     FILESOAPLUS1=$(awk '/serial/ { print $3+1 }' ${TRACEFILE} )
425     if [ "$DATE_SERIAL" -gt "$FILESOAPLUS1" ]; then
426         SERIAL="$DATE_SERIAL"
427     else
428         SERIAL="$FILESOAPLUS1"
429     fi
430     date -u > ${TRACEFILE}
431     echo "Using dak v1" >> ${TRACEFILE}
432     echo "Running on host: $(hostname -f)" >> ${TRACEFILE}
433     echo "Archive serial: ${SERIAL}" >> ${TRACEFILE}
434     cd ${mirrordir}
435     rsync -aH --link-dest ${ftpdir} --delete --delete-after --ignore-errors ${ftpdir}/. .
436 }
437
438 function expire() {
439     log "Expiring old database dumps..."
440     cd $base/backup
441     $scriptsdir/expire_dumps -d . -p -f "dump_*"
442 }
443
444 function transitionsclean() {
445     log "Removing out of date transitions..."
446     cd $base
447     dak transitions -c -a
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 $PGDATABASE 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-master.debian.org/s3kr1t/dot-gnupg/secring.gpg --keyring /srv/ftp-master.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 -a "X-Debian: DAK" -s "Log for dinstall run of ${NOW}" cron@ftp-master.debian.org -- -F "Debian FTP Masters" -f ftpmaster@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 }
575
576 # do a run of newstage only before dinstall is on.
577 function newstage() {
578     log "Processing the newstage queue"
579     UNCHECKED_WITHOUT_LOCK="-p"
580     do_newstage
581 }
582
583 # Function to update a "statefile" telling people what we are doing
584 # (more or less).
585 #
586 # This should be called with the argument(s)
587 #  - Status name we want to show.
588 #
589 function state() {
590     RIGHTNOW="$(date -u +"%a %b %d %T %Z %Y (%s)")"
591     cat >"${DINSTALLSTATE}" <<EOF
592 Dinstall start: ${DINSTALLBEGIN}
593 Current action: ${1}
594 Action start: ${RIGHTNOW}
595 EOF
596 }
597
598 # extract changelogs and stuff
599 function changelogs() {
600     log "Extracting changelogs"
601     dak make-changelog -e
602     mkdir -p ${exportpublic}/changelogs
603     cd ${exportpublic}/changelogs
604     rsync -aHW --delete --delete-after --ignore-errors ${exportdir}/changelogs/. .
605     sudo -H -u archvsync /home/archvsync/runmirrors metaftpdo > ~dak/runmirrors-metadata.log 2>&1 &
606 }