]> git.decadent.org.uk Git - dak.git/blob - config/backports/dinstall.functions
remove lenny
[dak.git] / config / backports / 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     if [ -r "${STAGEFILE}.log" ]; then
26         cat "${STAGEFILE}.log"
27     else
28         echo  "file ${STAGEFILE}.log does not exist, sorry"
29     fi | mail -s "${subject}" -a "X-Debian: DAK" cron@backports.debian.org -- -F "Debian FTP Masters" -f ftpmaster@ftp-master.debian.org
30 }
31
32 ########################################################################
33 # the actual dinstall functions follow                                 #
34 ########################################################################
35
36 function qa1() {
37     log "Telling QA user that we start dinstall"
38     ssh -2 -i ~dak/.ssh/push_merkel_qa  -o BatchMode=yes -o SetupTimeOut=90 -o ConnectTimeout=90 qa@qa.debian.org sleep 1
39  }
40
41 # Updating various files
42 function updates() {
43     log "Updating Bugs docu, Mirror list and mailing-lists.txt"
44     cd $configdir
45     $scriptsdir/update-bugdoctxt
46     $scriptsdir/update-mirrorlists
47     $scriptsdir/update-mailingliststxt
48     $scriptsdir/update-pseudopackages.sh
49 }
50
51 # Process (oldstable)-proposed-updates "NEW" queue
52 function punew_do() {
53     date -u -R >> REPORT
54     dak process-policy $1 | tee -a REPORT | mail -a "X-Debian: DAK" -e -s "NEW changes in $1" team@backports.debian.org -- -F "Debian FTP Masters" -f ftpmaster@ftp-master.debian.org
55     echo >> REPORT
56 }
57 function punew() {
58     log "Doing automated p-u-new processing"
59     cd "${queuedir}/p-u-new"
60     punew_do "$1"
61 }
62 function opunew() {
63     log "Doing automated o-p-u-new processing"
64     cd "${queuedir}/o-p-u-new"
65     punew_do "$1"
66 }
67
68 # The first i18n one, syncing new descriptions
69 function i18n1() {
70     log "Synchronizing i18n package descriptions"
71     # First sync their newest data
72     cd ${scriptdir}/i18nsync
73     rsync -aq --delete --delete-after ddtp-sync:/does/not/matter . || true
74
75     # Now check if we still know about the packages for which they created the files
76     # is the timestamp signed by us?
77     if $(gpgv --keyring /srv/ftp-master.debian.org/s3kr1t/dot-gnupg/pubring.gpg timestamp.gpg timestamp); then
78         # now read it. As its signed by us we are sure the content is what we expect, no need
79         # to do more here. And we only test -d a directory on it anyway.
80         TSTAMP=$(cat timestamp)
81         # do we have the dir still?
82         if [ -d ${scriptdir}/i18n/${TSTAMP} ]; then
83             # Lets check!
84             if ${scriptsdir}/ddtp-i18n-check.sh . ${scriptdir}/i18n/${TSTAMP}; then
85                 # Yay, worked, lets copy around
86                 for dir in wheezy sid; do
87                     if [ -d dists/${dir}/ ]; then
88                         cd dists/${dir}/main/i18n
89                         rsync -aq --delete --delete-after  . ${ftpdir}/dists/${dir}/main/i18n/.
90                     fi
91                     cd ${scriptdir}/i18nsync
92                 done
93             else
94                 echo "ARRRR, bad guys, wrong files, ARRR"
95                 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
96             fi
97         else
98             echo "ARRRR, missing the timestamp ${TSTAMP} directory, not updating i18n, ARRR"
99             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
100         fi
101     else
102         echo "ARRRRRRR, could not verify our timestamp signature, ARRR. Don't mess with our files, i18n guys, ARRRRR."
103         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
104     fi
105 }
106
107 function cruft() {
108     log "Checking for cruft in overrides"
109     dak check-overrides
110 }
111
112 function dominate() {
113     log "Removing obsolete source and binary associations"
114     dak dominate
115 }
116
117 function filelist() {
118     log "Generating file lists for apt-ftparchive"
119     dak generate-filelist
120 }
121
122 function fingerprints() {
123     log "Updating fingerprints"
124     dak import-keyring -L /srv/backports-master.debian.org/keyrings/keyring.gpg
125
126     OUTFILE=$(mktemp)
127     dak import-keyring --generate-users "%s" /srv/keyring.debian.org/keyrings/debian-maintainers.gpg >"${OUTFILE}"
128
129     if [ -s "${OUTFILE}" ]; then
130         /usr/sbin/sendmail -odq -oi -t -f envelope@ftp-master.debian.org <<EOF
131 From: Debian FTP Masters <ftpmaster@ftp-master.debian.org>
132 To: <debian-backports@lists.debian.org>
133 Subject: Debian Maintainers Keyring changes
134 Content-Type: text/plain; charset=utf-8
135 X-Debian: DAK
136 MIME-Version: 1.0
137
138 The following changes to the debian-maintainers keyring have just been activated:
139
140 $(cat $OUTFILE)
141
142 Debian distribution maintenance software,
143 on behalf of the Keyring maintainers
144
145 EOF
146     fi
147     rm -f "$OUTFILE"
148 }
149
150 function overrides() {
151     log "Writing overrides into text files"
152     cd $overridedir
153     dak make-overrides
154
155     # FIXME
156     rm -f override.sid.all3
157     for i in main contrib non-free main.debian-installer; do cat override.squeeze-backports.$i >> override.sid.all3; done
158 }
159
160 function mpfm() {
161     log "Generating package / file mapping"
162     dak make-pkg-file-mapping | bzip2 -9 > $base/ftp/indices/package-file.map.bz2
163 }
164
165 function packages() {
166     log "Generating Packages and Sources files"
167     cd $configdir
168     apt-ftparchive generate apt.conf
169     #dak generate-packages-sources
170 }
171
172 function pdiff() {
173     log "Generating pdiff files"
174     dak generate-index-diffs
175 }
176
177 function release() {
178     log "Generating Release files"
179     dak generate-releases
180 }
181
182 function dakcleanup() {
183     log "Cleanup old packages/files"
184     dak clean-suites -m 10000
185     dak clean-queues
186 }
187
188 function buildd_dir() {
189     # Rebuilt the buildd dir to avoid long times of 403
190     log "Regenerating the buildd incoming dir"
191     STAMP=$(date "+%Y%m%d%H%M")
192     make_buildd_dir
193 }
194
195 function mklslar() {
196     cd $ftpdir
197
198     FILENAME=ls-lR
199
200     log "Removing any core files ..."
201     find -type f -name core -print0 | xargs -0r rm -v
202
203     log "Checking permissions on files in the FTP tree ..."
204     find -type f \( \! -perm -444 -o -perm +002 \) -ls
205     find -type d \( \! -perm -555 -o -perm +002 \) -ls
206
207     log "Checking symlinks ..."
208     symlinks -rd .
209
210     log "Creating recursive directory listing ... "
211     rm -f .${FILENAME}.new
212     TZ=UTC ls -lR > .${FILENAME}.new
213
214     if [ -r ${FILENAME}.gz ] ; then
215         mv -f ${FILENAME}.gz ${FILENAME}.old.gz
216         mv -f .${FILENAME}.new ${FILENAME}
217         rm -f ${FILENAME}.patch.gz
218         zcat ${FILENAME}.old.gz | diff -u - ${FILENAME} | gzip -9cfn - >${FILENAME}.patch.gz
219         rm -f ${FILENAME}.old.gz
220     else
221         mv -f .${FILENAME}.new ${FILENAME}
222     fi
223
224     gzip -9cfN ${FILENAME} >${FILENAME}.gz
225     rm -f ${FILENAME}
226 }
227
228 function mkmaintainers() {
229     log 'Creating Maintainers index ... '
230
231     cd $indices
232     dak make-maintainers ${scriptdir}/masterfiles/pseudo-packages.maintainers
233     gzip -9v --rsyncable <Maintainers >Maintainers.gz
234     gzip -9v --rsyncable <Uploaders >Uploaders.gz
235 }
236
237 function copyoverrides() {
238     log 'Copying override files into public view ...'
239
240     for ofile in $copyoverrides ; do
241             cd $overridedir
242             chmod g+w override.$ofile
243
244             cd $indices
245
246             newofile=override.$ofile.gz
247             rm -f .newover-$ofile.gz
248             pc="`gzip 2>&1 -9nv <$overridedir/override.$ofile >.newover-$ofile.gz`"
249         if ! cmp -s .newover-$ofile.gz $newofile || [ ! -f $newofile ]; then
250                     log "   installing new $newofile $pc"
251                     mv -f .newover-$ofile.gz $newofile
252                     chmod g+w $newofile
253         else
254                     rm -f .newover-$ofile.gz
255             fi
256     done
257 }
258
259 function mkfilesindices() {
260     umask 002
261     cd $base/ftp/indices/files/components
262
263     ARCHLIST=$(tempfile)
264
265     log "Querying postgres"
266     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
267
268     includedirs () {
269         perl -ne 'print; while (m,/[^/]+$,) { $_=$`; print $_ . "\n" unless $d{$_}++; }'
270     }
271     poolfirst () {
272         perl -e '@nonpool=(); while (<>) { if (m,^\./pool/,) { print; } else { push @nonpool, $_; } } print for (@nonpool);'
273     }
274
275     log "Generating sources list"
276     (
277         sed -n 's/|$//p' $ARCHLIST
278         cd $base/ftp
279         find ./dists -maxdepth 1 \! -type d
280         find ./dists \! -type d | grep "/source/"
281     ) | sort -u | gzip -9 > source.list.gz
282
283     log "Generating arch lists"
284
285     ARCHES=$( (<$ARCHLIST sed -n 's/^.*|//p'; echo amd64) | grep . | grep -v all | sort -u)
286     for a in $ARCHES; do
287         (sed -n "s/|$a$//p" $ARCHLIST
288             sed -n 's/|all$//p' $ARCHLIST
289
290             cd $base/ftp
291             find ./dists -maxdepth 1 \! -type d
292             find ./dists \! -type d | grep -E "(proposed-updates.*_$a.changes$|/main/disks-$a/|/main/installer-$a/|/Contents-$a|/binary-$a/)"
293         ) | sort -u | gzip -9 > arch-$a.list.gz
294     done
295
296     log "Generating suite lists"
297
298     suite_list () {
299         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
300
301         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
302     }
303
304     printf 'SELECT id, suite_name FROM suite\n' | psql -F' ' -At |
305     while read id suite; do
306         [ -e $base/ftp/dists/$suite ] || continue
307         (
308             (cd $base/ftp
309                 distname=$(cd dists; readlink $suite || echo $suite)
310                 find ./dists/$distname \! -type d
311                 for distdir in ./dists/*; do
312                     [ "$(readlink $distdir)" != "$distname" ] || echo $distdir
313                 done
314             )
315             suite_list $id | tr -d ' ' | sed 's,^/srv/ftp-master.debian.org/ftp,.,'
316         ) | sort -u | gzip -9 > suite-${suite}.list.gz
317     done
318
319     log "Finding everything on the ftp site to generate sundries"
320     (cd $base/ftp; find . \! -type d \! -name 'Archive_Maintenance_In_Progress' | sort) >$ARCHLIST
321
322     rm -f sundries.list
323     zcat *.list.gz | cat - *.list | sort -u |
324     diff - $ARCHLIST | sed -n 's/^> //p' > sundries.list
325
326     log "Generating files list"
327
328     for a in $ARCHES; do
329         (echo ./project/trace; zcat arch-$a.list.gz source.list.gz) |
330         cat - sundries.list dists.list project.list docs.list indices.list |
331         sort -u | poolfirst > ../arch-$a.files
332     done
333
334     (cd $base/ftp/
335             for dist in sid wheezy; do
336                     find ./dists/$dist/main/i18n/ \! -type d | sort -u | gzip -9 > $base/ftp/indices/files/components/translation-$dist.list.gz
337             done
338     )
339
340     (cat ../arch-i386.files ../arch-amd64.files; zcat suite-proposed-updates.list.gz ; zcat translation-sid.list.gz ; zcat translation-wheezy.list.gz) |
341     sort -u | poolfirst > ../typical.files
342
343     rm -f $ARCHLIST
344     log "Done!"
345 }
346
347 function mkchecksums() {
348     dsynclist=$dbdir/dsync.list
349     md5list=$indices/md5sums
350
351     log -n "Creating md5 / dsync index file ... "
352
353     cd "$ftpdir"
354     ${bindir}/dsync-flist -q generate $dsynclist --exclude $dsynclist --md5
355     ${bindir}/dsync-flist -q md5sums $dsynclist | gzip -9n > ${md5list}.gz
356     ${bindir}/dsync-flist -q link-dups $dsynclist || true
357 }
358
359 function mirror() {
360     log "Regenerating \"public\" mirror/ hardlink fun"
361     DATE_SERIAL=$(date +"%Y%m%d01")
362     FILESOAPLUS1=$(awk '/serial/ { print $3+1 }' ${TRACEFILE} )
363     if [ "$DATE_SERIAL" -gt "$FILESOAPLUS1" ]; then
364         SERIAL="$DATE_SERIAL"
365     else
366         SERIAL="$FILESOAPLUS1"
367     fi
368     date -u > ${TRACEFILE}
369     echo "Using dak v1" >> ${TRACEFILE}
370     echo "Running on host: $(hostname -f)" >> ${TRACEFILE}
371     echo "Archive serial: ${SERIAL}" >> ${TRACEFILE}
372     cd ${mirrordir}
373     rsync -aH --link-dest ${ftpdir} --delete --delete-after --delete-excluded --exclude Packages.*.new --exclude Sources.*.new  --ignore-errors ${ftpdir}/. .
374 }
375
376 function expire() {
377     log "Expiring old database dumps..."
378     cd $base/backup
379     $scriptsdir/expire_dumps -d . -p -f "dump_*"
380 }
381
382 function transitionsclean() {
383     log "Removing out of date transitions..."
384     cd $base
385     dak transitions -c -a
386 }
387
388 function dm() {
389     log "Updating DM html page"
390     $scriptsdir/dm-monitor >$webdir/dm-uploaders.html
391 }
392
393 function bts() {
394     log "Categorizing uncategorized bugs filed against ftp.debian.org"
395     dak bts-categorize
396 }
397
398 function ddaccess() {
399     # Tell our dd accessible mirror to sync itself up. Including ftp dir.
400     log "Trigger dd accessible parts sync including ftp dir"
401     ssh -o Batchmode=yes -o ConnectTimeout=30 -o SetupTimeout=30 -2 -i ${base}/s3kr1t/pushddmirror dak@ries.debian.org pool
402 }
403
404 function mirrorpush() {
405     log "Starting the mirrorpush"
406     date -u > /srv/backports-web.debian.org/underlay/mirrorstart
407     echo "Using dak v1" >> /srv/backports-web.debian.org/underlay/mirrorstart
408     echo "Running on host $(hostname -f)" >> /srv/backports-web.debian.org/underlay/mirrorstart
409     sudo -H -u archvsync /home/archvsync/runmirrors > ~dak/runmirrors.log 2>&1 &
410 }
411
412 function i18n2() {
413     log "Exporting package data foo for i18n project"
414     STAMP=$(date "+%Y%m%d%H%M")
415     mkdir -p ${scriptdir}/i18n/${STAMP}
416     cd ${scriptdir}/i18n/${STAMP}
417     dak control-suite -l stable > squeeze
418     dak control-suite -l testing > wheezy
419     dak control-suite -l unstable > sid
420     echo "${STAMP}" > timestamp
421     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
422     rm -f md5sum
423     md5sum * > md5sum
424     cd ${webdir}/
425     ln -sfT ${scriptdir}/i18n/${STAMP} i18n
426
427     cd ${scriptdir}
428     find ./i18n -mindepth 1 -maxdepth 1 -mtime +2 -not -name "${STAMP}" -type d -print0 | xargs --no-run-if-empty -0 rm -rf
429 }
430
431 function stats() {
432     log "Updating stats data"
433     cd $configdir
434     #$scriptsdir/update-ftpstats $base/log/* > $base/misc/ftpstats.data
435     #R --slave --vanilla < $base/misc/ftpstats.R
436     dak stats arch-space > $webdir/arch-space
437     dak stats pkg-nums > $webdir/pkg-nums
438 }
439
440 function aptftpcleanup() {
441     log "Clean up apt-ftparchive's databases"
442     cd $configdir
443     apt-ftparchive -q clean apt.conf
444 }
445
446 function cleantransactions() {
447     log "Cleanup transaction ids older than 3 months"
448     cd $base/backup/
449     find -maxdepth 1 -mindepth 1 -type f -name 'txid_*' -mtime +90 -print0 | xargs -0 --no-run-if-empty rm
450 }
451
452 function logstats() {
453     $masterdir/tools/logs.py "$1"
454 }
455
456 # save timestamp when we start
457 function savetimestamp() {
458         NOW=`date "+%Y.%m.%d-%H:%M:%S"`
459         echo ${NOW} > "${dbdir}/dinstallstart"
460 }
461
462 function maillogfile() {
463     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
464 }
465
466 function renamelogfile() {
467     if [ -f "${dbdir}/dinstallstart" ]; then
468         NOW=$(cat "${dbdir}/dinstallstart")
469 #        maillogfile
470         mv "$LOGFILE" "$logdir/dinstall_${NOW}.log"
471 #        logstats "$logdir/dinstall_${NOW}.log"
472         bzip2 -9 "$logdir/dinstall_${NOW}.log"
473     else
474         error "Problem, I don't know when dinstall started, unable to do log statistics."
475         NOW=`date "+%Y.%m.%d-%H:%M:%S"`
476 #        maillogfile
477         mv "$LOGFILE" "$logdir/dinstall_${NOW}.log"
478         bzip2 -9 "$logdir/dinstall_${NOW}.log"
479     fi
480 }
481
482 function testingsourcelist() {
483     dak ls -s testing -f heidi -r .| egrep 'source$' > ${webdir}/testing.list
484 }
485
486 # do a last run of process-unchecked before dinstall is on.
487 function process_unchecked() {
488     log "Processing the unchecked queue"
489     UNCHECKED_WITHOUT_LOCK="-p"
490     do_unchecked
491     sync_debbugs
492 }
493
494 # do a run of newstage only before dinstall is on.
495 function newstage() {
496     log "Processing the newstage queue"
497     UNCHECKED_WITHOUT_LOCK="-p"
498     do_newstage
499 }
500
501 # Function to update a "statefile" telling people what we are doing
502 # (more or less).
503 #
504 # This should be called with the argument(s)
505 #  - Status name we want to show.
506 #
507 function state() {
508     RIGHTNOW="$(date -u +"%a %b %d %T %Z %Y (%s)")"
509     cat >"${DINSTALLSTATE}" <<EOF
510 Dinstall start: ${DINSTALLBEGIN}
511 Current action: ${1}
512 Action start: ${RIGHTNOW}
513 EOF
514 }
515
516 # extract changelogs and stuff
517 function changelogs() {
518     log "Extracting changelogs"
519     dak make-changelog -e
520     mkdir -p ${exportpublic}/changelogs
521     cd ${exportpublic}/changelogs
522     rsync -aHW --delete --delete-after --ignore-errors ${exportdir}/changelogs/. .
523     sudo -H -u archvsync /home/archvsync/runmirrors metabdo > ~dak/runmirrors-metadata.log 2>&1 &
524 }