]> git.decadent.org.uk Git - dak.git/blob - config/debian/dinstall.functions
031cad1929fa9fdeb4dbec8c51b1563999adebf0
[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 # Remove daily lock
8 function remove_daily_lock() {
9     rm -f $LOCK_DAILY
10 }
11
12 # Remove changelog lock
13 function remove_changelog_lock() {
14     rm -f $LOCK_CHANGELOG
15 }
16
17 # Remove all locks
18 function remove_all_locks() {
19     rm -f $LOCK_DAILY $LOCK_ACCEPTED
20 }
21
22 # If we error out this one is called, *FOLLOWED* by cleanup above
23 function onerror() {
24     ERRDATE=$(date "+%Y.%m.%d-%H:%M:%S")
25
26     subject="ATTENTION ATTENTION!"
27     if [ "${error}" = "false" ]; then
28         subject="${subject} (continued)"
29     else
30         subject="${subject} (interrupted)"
31     fi
32     subject="${subject} dinstall error at ${ERRDATE} in ${STAGEFILE} - (Be quiet, Brain, or I'll stab you with a Q-tip)"
33
34     if [ -r "${STAGEFILE}.log" ]; then
35         cat "${STAGEFILE}.log"
36     else
37         echo "file ${STAGEFILE}.log does not exist, sorry"
38     fi | mail -s "${subject}" -a "X-Debian: DAK" -a "From: Debian FTP Masters <ftpmaster@ftp-master.debian.org>" cron@ftp-master.debian.org
39 }
40
41 ########################################################################
42 # the actual dinstall functions follow                                 #
43 ########################################################################
44
45 # pushing merkels QA user, part one
46 function qa1() {
47     log "Telling QA user that we start dinstall"
48     ssh -2 -i ~dak/.ssh/push_merkel_qa  -o BatchMode=yes -o SetupTimeOut=90 -o ConnectTimeout=90 qa@qa.debian.org sleep 1
49 }
50
51 # Updating various files
52 function updates() {
53     log "Updating Bugs docu, Mirror list and mailing-lists.txt"
54     cd $configdir
55     $scriptsdir/update-bugdoctxt
56     $scriptsdir/update-mirrorlists
57     $scriptsdir/update-mailingliststxt
58     $scriptsdir/update-pseudopackages.sh
59 }
60
61 # The first i18n one, syncing new descriptions
62 function i18n1() {
63     log "Synchronizing i18n package descriptions"
64     # First sync their newest data
65     cd ${scriptdir}/i18nsync
66     rsync -aq --delete --delete-after ddtp-sync:/does/not/matter . || true
67
68     # Now check if we still know about the packages for which they created the files
69     # is the timestamp signed by us?
70     if $(gpgv --keyring /srv/ftp-master.debian.org/s3kr1t/dot-gnupg/pubring.gpg timestamp.gpg timestamp); then
71         # now read it. As its signed by us we are sure the content is what we expect, no need
72         # to do more here. And we only test -d a directory on it anyway.
73         TSTAMP=$(cat timestamp)
74         # do we have the dir still?
75         if [ -d ${scriptdir}/i18n/${TSTAMP} ]; then
76             # Lets check!
77             if ${scriptsdir}/ddtp-i18n-check.sh . ${scriptdir}/i18n/${TSTAMP}; then
78                 # Yay, worked, lets copy around
79                 for dir in stretch sid; do
80                     if [ -d dists/${dir}/ ]; then
81                         cd dists/${dir}/main/i18n
82                         rsync -aq --delete --delete-after --exclude Translation-en.bz2 --exclude Translation-*.diff/ . ${ftpdir}/dists/${dir}/main/i18n/.
83                     fi
84                     cd ${scriptdir}/i18nsync
85                 done
86             else
87                 echo "ARRRR, bad guys, wrong files, ARRR"
88                 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." -a "From: Debian FTP Masters <ftpmaster@ftp-master.debian.org>" debian-l10n-devel@lists.alioth.debian.org
89             fi
90         else
91             echo "ARRRR, missing the timestamp ${TSTAMP} directory, not updating i18n, ARRR"
92             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." -a "From: Debian FTP Masters <ftpmaster@ftp-master.debian.org>" debian-l10n-devel@lists.alioth.debian.org
93         fi
94     else
95         echo "ARRRRRRR, could not verify our timestamp signature, ARRR. Don't mess with our files, i18n guys, ARRRRR."
96         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." -a "From: Debian FTP Masters <ftpmaster@ftp-master.debian.org>" debian-l10n-devel@lists.alioth.debian.org
97     fi
98 }
99
100 # Syncing AppStream/DEP-11 data
101 function dep11() {
102     log "Synchronizing AppStream metadata"
103     # First sync their newest data
104     mkdir -p ${scriptdir}/dep11
105     cd ${scriptdir}/dep11
106     rsync -aq --delete --delete-after dep11-sync:/does/not/matter . || true
107
108     # Lets check!
109     if ${scriptsdir}/dep11-basic-validate.py . ${scriptdir}/dep11/; then
110         # Yay, worked, lets copy around
111         for dir in stretch sid; do
112             if [ -d ${dir}/ ]; then
113                 for comp in main contrib non-free; do
114                     mkdir -p ${ftpdir}/dists/${dir}/${comp}/dep11
115                     cd ${dir}/${comp}
116                     rsync -aq --delete --delete-after --exclude *.tmp . ${ftpdir}/dists/${dir}/${comp}/dep11/.
117                     cd ${scriptdir}/dep11
118                 done
119             fi
120         done
121     else
122         echo "ARRRR, bad guys, wrong files, ARRR"
123         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." -a "From: Debian FTP Masters <ftpmaster@ftp-master.debian.org>" mak@debian.org
124     fi
125 }
126
127 function cruft() {
128     log "Checking for cruft in overrides"
129     dak check-overrides
130 }
131
132 function dominate() {
133     log "Removing obsolete source and binary associations"
134     dak dominate
135 }
136
137 function autocruft() {
138     log "Check for obsolete binary packages"
139     dak auto-decruft -s unstable
140     dak auto-decruft -s experimental --if-newer-version-in unstable --if-newer-version-in-rm-msg "NVIU"
141 }
142
143 function fingerprints() {
144     log "Updating fingerprints"
145     dak import-keyring -L /srv/keyring.debian.org/keyrings/debian-keyring.gpg
146
147     OUTFILE=$(mktemp)
148     dak import-keyring --generate-users "%s" /srv/keyring.debian.org/keyrings/debian-maintainers.gpg >"${OUTFILE}"
149
150     if [ -s "${OUTFILE}" ]; then
151         /usr/sbin/sendmail -odq -oi -t -f envelope@ftp-master.debian.org <<EOF
152 From: Debian FTP Masters <ftpmaster@ftp-master.debian.org>
153 To: <debian-project@lists.debian.org>
154 Subject: Debian Maintainers Keyring changes
155 Content-Type: text/plain; charset=utf-8
156 X-Debian: DAK
157 MIME-Version: 1.0
158
159 The following changes to the debian-maintainers keyring have just been activated:
160
161 $(cat $OUTFILE)
162
163 Debian distribution maintenance software,
164 on behalf of the Keyring maintainers
165
166 EOF
167     fi
168     rm -f "$OUTFILE"
169 }
170
171 function overrides() {
172     log "Writing overrides into text files"
173     cd $overridedir
174     dak make-overrides
175 }
176
177 function mpfm() {
178     local archiveroot
179
180     log "Generating package / file mapping"
181     for archive in "${public_archives[@]}"; do
182         archiveroot="$(get_archiveroot "${archive}")"
183         dak make-pkg-file-mapping "${archive}" | bzip2 -9 > "${archiveroot}/indices/package-file.map.bz2"
184     done
185 }
186
187 function packages() {
188     log "Generating Packages and Sources files"
189     for archive in "${public_archives[@]}"; do
190         log "  Generating Packages/Sources for ${archive}"
191         dak generate-packages-sources2 -a "${archive}"
192         log "  Generating Contents for ${archive}"
193         dak contents generate -a "${archive}"
194     done
195 }
196
197 function pdiff() {
198     log "Generating pdiff files"
199     dak generate-index-diffs
200 }
201
202 function release() {
203     log "Generating Release files"
204     for archive in "${public_archives[@]}"; do
205         dak generate-releases -a "${archive}"
206     done
207 }
208
209 function dakcleanup() {
210     log "Cleanup old packages/files"
211     dak clean-suites -m 10000
212     dak clean-queues -i "$unchecked"
213 }
214
215 function mklslar() {
216     local archiveroot
217     local FILENAME=ls-lR
218
219     for archive in "${public_archives[@]}"; do
220         archiveroot="$(get_archiveroot "${archive}")"
221         cd "${archiveroot}"
222
223         log "Removing any core files ..."
224         find -type f -name core -print -delete
225
226         log "Checking symlinks ..."
227         symlinks -rd .
228
229         log "Creating recursive directory listing ... "
230         rm -f ${FILENAME}.gz
231         TZ=UTC ls -lR | gzip -9c --rsyncable > ${FILENAME}.gz
232     done
233 }
234
235 function mkmaintainers() {
236     local archiveroot
237     local indices
238
239     log 'Creating Maintainers index ... '
240
241     for archive in "${public_archives[@]}"; do
242         archiveroot="$(get_archiveroot "${archive}")"
243         indices="${archiveroot}/indices"
244         if ! [ -d "${indices}" ]; then
245             mkdir "${indices}"
246         fi
247         cd "${indices}"
248
249         dak make-maintainers -a "${archive}" ${scriptdir}/masterfiles/pseudo-packages.maintainers
250         gzip -9v --rsyncable <Maintainers >Maintainers.gz
251         gzip -9v --rsyncable <Uploaders >Uploaders.gz
252     done
253 }
254
255 function copyoverrides() {
256     log 'Copying override files into public view ...'
257
258     (
259         shopt -s nullglob
260         for ofile in ${overridedir}/override.{squeeze,wheezy,jessie,stretch,sid}.{,extra.}{main,contrib,non-free}*; do
261             bname=${ofile##*/}
262             gzip -9cv --rsyncable ${ofile} > ${indices}/${bname}.gz
263             chmod g+w ${indices}/${bname}.gz
264         done
265     )
266 }
267
268 function mkfilesindices() {
269     set +o pipefail
270     umask 002
271     cd $base/ftp/indices/files/components
272
273     ARCHLIST=$(tempfile)
274
275     log "Querying postgres"
276     local query="
277       SELECT './pool/' || c.name || '/' || f.filename AS path, a.arch_string AS arch_string
278       FROM files f
279       JOIN files_archive_map af ON f.id = af.file_id
280       JOIN component c ON af.component_id = c.id
281       JOIN archive ON af.archive_id = archive.id
282       LEFT OUTER JOIN
283         (binaries b
284          JOIN architecture a ON b.architecture = a.id)
285         ON f.id = b.file
286       WHERE archive.name = 'ftp-master'
287       ORDER BY path, arch_string
288     "
289     psql -At -c "$query" >$ARCHLIST
290
291     includedirs () {
292         perl -ne 'print; while (m,/[^/]+$,) { $_=$`; print $_ . "\n" unless $d{$_}++; }'
293     }
294     poolfirst () {
295         perl -e '@nonpool=(); while (<>) { if (m,^\./pool/,) { print; } else { push @nonpool, $_; } } print for (@nonpool);'
296     }
297
298     log "Generating sources list"
299     (
300         sed -n 's/|$//p' $ARCHLIST
301         cd $base/ftp
302         find ./dists -maxdepth 1 \! -type d
303         find ./dists \! -type d | grep "/source/"
304     ) | sort -u | gzip -9 > source.list.gz
305
306     log "Generating arch lists"
307
308     ARCHES=$( (<$ARCHLIST sed -n 's/^.*|//p'; echo amd64) | grep . | grep -v all | sort -u)
309     for a in $ARCHES; do
310         (sed -n "s/|$a$//p" $ARCHLIST
311             sed -n 's/|all$//p' $ARCHLIST
312
313             cd $base/ftp
314             find ./dists -maxdepth 1 \! -type d
315             find ./dists \! -type d | grep -E "(proposed-updates.*_$a.changes$|/main/disks-$a/|/main/installer-$a/|/Contents-$a|/binary-$a/)"
316         ) | sort -u | gzip -9 > arch-$a.list.gz
317     done
318
319     log "Generating suite lists"
320
321     suite_list () {
322         local suite_id="$(printf %d $1)"
323         local query
324         query="
325           SELECT DISTINCT './pool/' || c.name || '/' || f.filename
326           FROM
327             (SELECT sa.source AS source
328                FROM src_associations sa
329               WHERE sa.suite = $suite_id
330              UNION
331              SELECT esr.src_id
332                FROM extra_src_references esr
333                JOIN bin_associations ba ON esr.bin_id = ba.bin
334                WHERE ba.suite = $suite_id
335              UNION
336              SELECT b.source AS source
337                FROM bin_associations ba
338                JOIN binaries b ON ba.bin = b.id WHERE ba.suite = $suite_id) s
339             JOIN dsc_files df ON s.source = df.source
340             JOIN files f ON df.file = f.id
341             JOIN files_archive_map af ON f.id = af.file_id
342             JOIN component c ON af.component_id = c.id
343             JOIN archive ON af.archive_id = archive.id
344             WHERE archive.name = 'ftp-master'
345         "
346         psql -F' ' -A -t -c "$query"
347
348         query="
349           SELECT './pool/' || c.name || '/' || f.filename
350           FROM bin_associations ba
351           JOIN binaries b ON ba.bin = b.id
352           JOIN files f ON b.file = f.id
353           JOIN files_archive_map af ON f.id = af.file_id
354           JOIN component c ON af.component_id = c.id
355           JOIN archive ON af.archive_id = archive.id
356           WHERE ba.suite = $suite_id AND archive.name = 'ftp-master'
357         "
358         psql -F' ' -A -t -c "$query"
359     }
360
361     psql -F' ' -At -c "SELECT id, suite_name FROM suite" |
362     while read id suite; do
363         [ -e $base/ftp/dists/$suite ] || continue
364         (
365             (cd $base/ftp
366                 distname=$(cd dists; readlink $suite || echo $suite)
367                 find ./dists/$distname \! -type d
368                 for distdir in ./dists/*; do
369                     [ "$(readlink $distdir)" != "$distname" ] || echo $distdir
370                 done
371             )
372             suite_list $id
373         ) | sort -u | gzip -9 > suite-${suite}.list.gz
374     done
375
376     log "Finding everything on the ftp site to generate sundries"
377     (cd $base/ftp; find . \! -type d \! -name 'Archive_Maintenance_In_Progress' | sort) >$ARCHLIST
378
379     rm -f sundries.list
380     zcat *.list.gz | cat - *.list | sort -u |
381     diff - $ARCHLIST | sed -n 's/^> //p' > sundries.list
382
383     log "Generating files list"
384
385     for a in $ARCHES; do
386         (echo ./project/trace; zcat arch-$a.list.gz source.list.gz) |
387         cat - sundries.list dists.list project.list docs.list indices.list |
388         sort -u | poolfirst > ../arch-$a.files
389     done
390
391     (cd $base/ftp/
392             for dist in sid jessie stretch; do
393                     find ./dists/$dist/main/i18n/ \! -type d | sort -u | gzip -9 > $base/ftp/indices/files/components/translation-$dist.list.gz
394             done
395     )
396
397     (cat ../arch-i386.files ../arch-amd64.files; zcat suite-proposed-updates.list.gz ; zcat translation-sid.list.gz ; zcat translation-jessie.list.gz ; zcat translation-stretch.list.gz) |
398     sort -u | poolfirst > ../typical.files
399
400     rm -f $ARCHLIST
401     log "Done!"
402     set -o pipefail
403 }
404
405 function mkchecksums() {
406     local archiveroot dsynclist md5list
407
408     for archive in "${public_archives[@]}"; do
409         archiveroot="$(get_archiveroot "${archive}")"
410         dsynclist=$dbdir/dsync.${archive}.list
411         md5list=${archiveroot}/indices/md5sums
412
413         log -n "Creating md5 / dsync index file for ${archive}... "
414
415         cd "$archiveroot"
416         ${bindir}/dsync-flist -q generate $dsynclist --exclude $dsynclist --md5
417         ${bindir}/dsync-flist -q md5sums $dsynclist | gzip -9n > ${md5list}.gz
418         ${bindir}/dsync-flist -q link-dups $dsynclist || true
419     done
420 }
421
422 function mirror() {
423     local archiveroot mirrordir
424
425     log "Regenerating \"public\" mirror/ hardlink fun"
426     DATE_SERIAL=$(date +"%Y%m%d01")
427     FILESOAPLUS1=$(awk '/serial/ { print $3+1 }' ${TRACEFILE} )
428     if [ "$DATE_SERIAL" -gt "$FILESOAPLUS1" ]; then
429         SERIAL="$DATE_SERIAL"
430     else
431         SERIAL="$FILESOAPLUS1"
432     fi
433     date -u > ${TRACEFILE}
434     echo "Using dak v1" >> ${TRACEFILE}
435     echo "Running on host: $(hostname -f)" >> ${TRACEFILE}
436     echo "Archive serial: ${SERIAL}" >> ${TRACEFILE}
437
438     # Ugly "hack", but hey, it does what we want.
439     cp ${TRACEFILE} ${TRACEFILE_BDO}
440
441     for archive in ftp-master backports; do
442         archiveroot="$(get_archiveroot "${archive}")"
443         mirrordir="${archiveroot}/../mirror"
444         cd ${mirrordir}
445         rsync -aH --link-dest ${archiveroot} --delete --delete-after --delete-excluded --exclude Packages.*.new --exclude Sources.*.new  --ignore-errors ${archiveroot}/. .
446     done
447 }
448
449 function expire() {
450     log "Expiring old database dumps..."
451     cd $base/backup
452     $scriptsdir/expire_dumps -d . -p -f "dump_*"
453 }
454
455 function transitionsclean() {
456     log "Removing out of date transitions..."
457     cd $base
458     dak transitions -c -a
459 }
460
461 function dm() {
462     log "Updating DM permissions page"
463     dak acl export-per-source dm >$exportdir/dm.txt
464 }
465
466 function bts() {
467     log "Categorizing uncategorized bugs filed against ftp.debian.org"
468     sudo -u dak-unpriv dak bts-categorize
469 }
470
471 function ddaccess() {
472     # Tell our dd accessible mirror to sync itself up. Including ftp dir.
473     log "Trigger dd accessible parts sync including ftp dir"
474     ${scriptsdir}/sync-dd dd-sync dd-sync1 dd-sync2 sync
475 }
476
477 function mirrorpush() {
478     log "Checking the public archive copy"
479     cd ${mirrordir}/dists
480
481     broken=0
482     for release in $(find . -name "InRelease"); do
483         echo "Processing: ${release}"
484         subdir=${release%/InRelease}
485         while read SHASUM SIZE NAME; do
486             if ! [ -f "${subdir}/${NAME}" ]; then
487                bname=$(basename ${NAME})
488                if [[ "${bname}" =~ ^(Packages|Sources|Contents-[a-zA-Z0-9-]+|Translation-[a-zA-Z_]+|Components-(amd64|i386)\.yml|icons-(128x128|64x64)\.tar)$ ]]; then
489
490                     # We don't keep unpacked files, don't check for their existance.
491                     # We might want to go and check their unpacked shasum, but right now
492                     # I don't care. I believe it should be enough if all the packed shasums
493                     # match.
494                     continue
495                 fi
496                 broken=$(( broken + 1 ))
497                 echo "File ${subdir}/${NAME} is missing"
498                 continue
499             fi
500
501            # We do have symlinks in the tree (see the contents files currently).
502            # So we use "readlink -f" to check the size of the target, as thats basically
503            # what gen-releases does
504             fsize=$(stat -c %s $(readlink -f "${subdir}/${NAME}"))
505             if [ ${fsize} -ne ${SIZE} ]; then
506                 broken=$(( broken + 1 ))
507                 echo "File ${subdir}/${NAME} has size ${fsize}, expected is ${SIZE}"
508                 continue
509             fi
510
511             fshasum=$(sha1sum $(readlink -f "${subdir}/${NAME}"))
512             fshasum=${fshasum%% *}
513             if [ "${fshasum}" != "${SHASUM}" ]; then
514                 broken=$(( broken + 1 ))
515                 echo "File ${subdir}/${NAME} has checksum ${fshasum}, expected is ${SHASUM}"
516                 continue
517             fi
518         done < <(sed '1,/SHA1:/d' "${release}" | sed '/SHA256:/,$d')
519     done
520
521     if [ $broken -gt 0 ]; then
522         log_error "Trouble with the public mirror, found ${broken} errors"
523         return 21
524     fi
525
526     log "Starting the mirrorpush"
527     date -u > /srv/ftp.debian.org/web/mirrorstart
528     echo "Using dak v1" >> /srv/ftp.debian.org/web/mirrorstart
529     echo "Running on host $(hostname -f)" >> /srv/ftp.debian.org/web/mirrorstart
530     sudo -H -u archvsync /home/archvsync/runmirrors > ~dak/runmirrors.log 2>&1 &
531     sudo -H -u archvsync /home/archvsync/runmirrors -a backports > ~dak/runmirrorsbpo.log 2>&1 &
532 }
533
534 function mirrorpush-backports() {
535     log "Syncing backports mirror"
536     sudo -u backports /home/backports/bin/update-archive
537 }
538
539 function i18n2() {
540     log "Exporting package data foo for i18n project"
541     STAMP=$(date "+%Y%m%d%H%M")
542     mkdir -p ${scriptdir}/i18n/${STAMP}
543     cd ${scriptdir}/i18n/${STAMP}
544     for suite in stable testing unstable; do
545         codename=$(dak admin s show ${suite}|grep '^Codename')
546         codename=${codename##* }
547         echo "Codename is ${codename}"
548         dak control-suite -l ${suite} >${codename}
549     done
550     echo "${STAMP}" > timestamp
551     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 473041FA --detach-sign -o timestamp.gpg timestamp
552     rm -f md5sum
553     md5sum * > md5sum
554     cd ${webdir}/
555     ln -sfT ${scriptdir}/i18n/${STAMP} i18n
556
557     cd ${scriptdir}
558     find ./i18n -mindepth 1 -maxdepth 1 -mtime +2 -not -name "${STAMP}" -type d -print0 | xargs --no-run-if-empty -0 rm -rf
559 }
560
561 function stats() {
562     log "Updating stats data"
563     cd $configdir
564     $scriptsdir/update-ftpstats $base/log/* > $base/misc/ftpstats.data
565     R --slave --vanilla < $base/misc/ftpstats.R
566     dak stats arch-space > $webdir/arch-space
567     dak stats pkg-nums > $webdir/pkg-nums
568 }
569
570 function cleantransactions() {
571     log "Cleanup transaction ids older than 3 months"
572     cd $base/backup/
573     find -maxdepth 1 -mindepth 1 -type f -name 'txid_*' -mtime +90 -delete
574 }
575
576 function logstats() {
577     $masterdir/tools/logs.py "$1"
578 }
579
580 # save timestamp when we start
581 function savetimestamp() {
582         NOW=`date "+%Y.%m.%d-%H:%M:%S"`
583         echo ${NOW} > "${dbdir}/dinstallstart"
584 }
585
586 function maillogfile() {
587     cat "$LOGFILE" | mail -a "X-Debian: DAK" -s "Log for dinstall run of ${NOW}" -a "From: Debian FTP Masters <ftpmaster@ftp-master.debian.org>" cron@ftp-master.debian.org
588 }
589
590 function renamelogfile() {
591     if [ -f "${dbdir}/dinstallstart" ]; then
592         NOW=$(cat "${dbdir}/dinstallstart")
593 #        maillogfile
594         mv "$LOGFILE" "$logdir/dinstall_${NOW}.log"
595         logstats "$logdir/dinstall_${NOW}.log"
596         bzip2 -9 "$logdir/dinstall_${NOW}.log"
597     else
598         error "Problem, I don't know when dinstall started, unable to do log statistics."
599         NOW=`date "+%Y.%m.%d-%H:%M:%S"`
600 #        maillogfile
601         mv "$LOGFILE" "$logdir/dinstall_${NOW}.log"
602         bzip2 -9 "$logdir/dinstall_${NOW}.log"
603     fi
604 }
605
606 function testingsourcelist() {
607     dak ls -s testing -f heidi -r .| egrep 'source$' > ${webdir}/testing.list
608 }
609
610 # do a last run of process-unchecked before dinstall is on.
611 function process_unchecked() {
612     log "Processing the unchecked queue"
613     UNCHECKED_WITHOUT_LOCK="-p"
614     do_unchecked
615     sync_debbugs
616 }
617
618 # Function to update a "statefile" telling people what we are doing
619 # (more or less).
620 #
621 # This should be called with the argument(s)
622 #  - Status name we want to show.
623 #
624 function state() {
625     RIGHTNOW="$(date -u +"%a %b %d %T %Z %Y (%s)")"
626     cat >"${DINSTALLSTATE}" <<EOF
627 Dinstall start: ${DINSTALLBEGIN}
628 Current action: ${1}
629 Action start: ${RIGHTNOW}
630 EOF
631 }
632
633 # extract changelogs and stuff
634 function changelogs() {
635     if lockfile -r3 $LOCK_CHANGELOG; then
636         log "Extracting changelogs"
637         dak make-changelog -e -a ftp-master
638         [ -f ${exportdir}/changelogs/filelist.yaml ] && xz -f ${exportdir}/changelogs/filelist.yaml
639         mkdir -p ${exportpublic}/changelogs
640         cd ${exportpublic}/changelogs
641         rsync -aHW --delete --delete-after --ignore-errors ${exportdir}/changelogs/. .
642         sudo -H -u staticsync /usr/local/bin/static-update-component metadata.ftp-master.debian.org >/dev/null 2>&1 &
643
644         dak make-changelog -e -a backports
645         [ -f /srv/backports-master.debian.org/export/changelogs/filelist.yaml ] && xz -f /srv/backports-master.debian.org/export/changelogs/filelist.yaml
646         mkdir -p /srv/backports-master.debian.org/rsync/export/changelogs
647         cd /srv/backports-master.debian.org/rsync/export/changelogs
648         rsync -aHW --delete --delete-after --ignore-errors /srv/backports-master.debian.org/export/changelogs/. .
649         remove_changelog_lock
650         trap remove_changelog_lock EXIT TERM HUP INT QUIT
651     fi
652 }
653
654 function gitpdiff() {
655     # Might be that we want to change this to have more than one git repository.
656     # Advantage of one is that we do not need much space in terms of storage in git itself,
657     # git gc is pretty good on our input.
658     # But it might be faster. Well, lets test.
659     log "Adjusting the git tree for pdiffs"
660     cd ${dbdir}/git/git/
661
662     # The regex needs the architectures seperated with \|
663     garchs=$(dak admin a list|sed -e ':q;N;s/\n/\\|/g;t q')
664
665     # First, get all the files we want to work on. ../dists/ is a symlink to the real dists/ we
666     # want to work with.
667     # Also, we only want contents, packages and sources.
668     for file in $(find ../dists/ -regex ".*/\(Contents-\($archs\)\|\(Packages\|Sources\)\).gz"); do
669         log "${file}"
670         basen=${file%%.gz};
671         basen=${basen##../};
672         dir=${basen%/*};
673         mkdir -p $dir;
674         zcat $file > $basen;
675     done
676
677     # Second, add all there is into git
678     cd dists
679     git add .
680     # Maybe we want to make this the same for tag and commit? But well, shouldn't matter
681     COMD=$(date  -Is)
682     TAGD=$(date +%Y-%m-%d-%H-%M)
683     git commit -m "Commit of ${COMD}"
684     git tag "${TAGD}"
685  }