]> git.decadent.org.uk Git - dak.git/blob - config/debian/dinstall.functions
remove wb
[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 dominate() {
133     log "Removing obsolete source and binary associations"
134     dak dominate
135 }
136
137 function filelist() {
138     log "Generating file lists for apt-ftparchive"
139     dak generate-filelist
140 }
141
142 function fingerprints() {
143     log "Not updating fingerprints - scripts needs checking"
144
145     log "Updating fingerprints"
146     dak import-keyring -L /srv/keyring.debian.org/keyrings/debian-keyring.gpg
147
148     OUTFILE=$(mktemp)
149     dak import-keyring --generate-users "%s" /srv/keyring.debian.org/keyrings/debian-maintainers.gpg >"${OUTFILE}"
150
151     if [ -s "${OUTFILE}" ]; then
152         /usr/sbin/sendmail -odq -oi -t -f envelope@ftp-master.debian.org <<EOF
153 From: Debian FTP Masters <ftpmaster@ftp-master.debian.org>
154 To: <debian-project@lists.debian.org>
155 Subject: Debian Maintainers Keyring changes
156 Content-Type: text/plain; charset=utf-8
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     # FIXME
177     rm -f override.sid.all3
178     for i in main contrib non-free main.debian-installer; do cat override.sid.$i >> override.sid.all3; done
179 }
180
181 function mpfm() {
182     log "Generating package / file mapping"
183     dak make-pkg-file-mapping | bzip2 -9 > $base/ftp/indices/package-file.map.bz2
184 }
185
186 function packages() {
187     log "Generating Packages and Sources files"
188     cd $configdir
189     GZIP='--rsyncable' ; export GZIP
190     apt-ftparchive generate apt.conf
191 }
192
193 function pdiff() {
194     log "Generating pdiff files"
195     dak generate-index-diffs
196 }
197
198 function release() {
199     log "Generating Release files"
200     dak generate-releases
201 }
202
203 function dakcleanup() {
204     log "Cleanup old packages/files"
205     dak clean-suites -m 10000
206     dak clean-queues
207 }
208
209 function buildd_dir() {
210     # Rebuilt the buildd dir to avoid long times of 403
211     log "Regenerating the buildd incoming dir"
212     STAMP=$(date "+%Y%m%d%H%M")
213     make_buildd_dir
214 }
215
216 function mklslar() {
217     cd $ftpdir
218
219     FILENAME=ls-lR
220
221     log "Removing any core files ..."
222     find -type f -name core -print0 | xargs -0r rm -v
223
224     log "Checking permissions on files in the FTP tree ..."
225     find -type f \( \! -perm -444 -o -perm +002 \) -ls
226     find -type d \( \! -perm -555 -o -perm +002 \) -ls
227
228     log "Checking symlinks ..."
229     symlinks -rd .
230
231     log "Creating recursive directory listing ... "
232     rm -f .${FILENAME}.new
233     TZ=UTC ls -lR > .${FILENAME}.new
234
235     if [ -r ${FILENAME}.gz ] ; then
236         mv -f ${FILENAME}.gz ${FILENAME}.old.gz
237         mv -f .${FILENAME}.new ${FILENAME}
238         rm -f ${FILENAME}.patch.gz
239         zcat ${FILENAME}.old.gz | diff -u - ${FILENAME} | gzip --rsyncable -9cfn - >${FILENAME}.patch.gz
240         rm -f ${FILENAME}.old.gz
241     else
242         mv -f .${FILENAME}.new ${FILENAME}
243     fi
244
245     gzip --rsyncable -9cfN ${FILENAME} >${FILENAME}.gz
246     rm -f ${FILENAME}
247 }
248
249 function mkmaintainers() {
250     log 'Creating Maintainers index ... '
251
252     cd $indices
253     dak make-maintainers ${scriptdir}/masterfiles/pseudo-packages.maintainers | \
254         sed -e "s/~[^  ]*\([   ]\)/\1/"  | \
255         awk '{printf "%-20s ", $1; for (i=2; i<=NF; i++) printf "%s ", $i; printf "\n";}' > .new-maintainers
256
257     if ! cmp -s .new-maintainers Maintainers || [ ! -f Maintainers ]; then
258             log "installing Maintainers ... "
259             mv -f .new-maintainers Maintainers
260             gzip --rsyncable -9v <Maintainers >.new-maintainers.gz
261             mv -f .new-maintainers.gz Maintainers.gz
262     else
263         rm -f .new-maintainers
264     fi
265 }
266
267 function copyoverrides() {
268     log 'Copying override files into public view ...'
269
270     for ofile in $copyoverrides ; do
271             cd $overridedir
272             chmod g+w override.$ofile
273
274             cd $indices
275
276             newofile=override.$ofile.gz
277             rm -f .newover-$ofile.gz
278             pc="`gzip 2>&1 -9nv <$overridedir/override.$ofile >.newover-$ofile.gz`"
279         if ! cmp -s .newover-$ofile.gz $newofile || [ ! -f $newofile ]; then
280                     log "   installing new $newofile $pc"
281                     mv -f .newover-$ofile.gz $newofile
282                     chmod g+w $newofile
283         else
284                     rm -f .newover-$ofile.gz
285             fi
286     done
287 }
288
289 function mkfilesindices() {
290     umask 002
291     cd $base/ftp/indices/files/components
292
293     ARCHLIST=$(tempfile)
294
295     log "Querying projectb..."
296     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
297
298     includedirs () {
299         perl -ne 'print; while (m,/[^/]+$,) { $_=$`; print $_ . "\n" unless $d{$_}++; }'
300     }
301     poolfirst () {
302         perl -e '@nonpool=(); while (<>) { if (m,^\./pool/,) { print; } else { push @nonpool, $_; } } print for (@nonpool);'
303     }
304
305     log "Generating sources list"
306     (
307         sed -n 's/|$//p' $ARCHLIST
308         cd $base/ftp
309         find ./dists -maxdepth 1 \! -type d
310         find ./dists \! -type d | grep "/source/"
311     ) | sort -u | gzip --rsyncable -9 > source.list.gz
312
313     log "Generating arch lists"
314
315     ARCHES=$( (<$ARCHLIST sed -n 's/^.*|//p'; echo amd64) | grep . | grep -v all | sort -u)
316     for a in $ARCHES; do
317         (sed -n "s/|$a$//p" $ARCHLIST
318             sed -n 's/|all$//p' $ARCHLIST
319
320             cd $base/ftp
321             find ./dists -maxdepth 1 \! -type d
322             find ./dists \! -type d | grep -E "(proposed-updates.*_$a.changes$|/main/disks-$a/|/main/installer-$a/|/Contents-$a|/binary-$a/)"
323         ) | sort -u | gzip --rsyncable -9 > arch-$a.list.gz
324     done
325
326     log "Generating suite lists"
327
328     suite_list () {
329         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
330
331         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
332     }
333
334     printf 'SELECT id, suite_name FROM suite\n' | psql -F' ' -At projectb |
335     while read id suite; do
336         [ -e $base/ftp/dists/$suite ] || continue
337         (
338             (cd $base/ftp
339                 distname=$(cd dists; readlink $suite || echo $suite)
340                 find ./dists/$distname \! -type d
341                 for distdir in ./dists/*; do
342                     [ "$(readlink $distdir)" != "$distname" ] || echo $distdir
343                 done
344             )
345             suite_list $id | tr -d ' ' | sed 's,^/srv/ftp.debian.org/ftp,.,'
346         ) | sort -u | gzip --rsyncable -9 > suite-${suite}.list.gz
347     done
348
349     log "Finding everything on the ftp site to generate sundries"
350     (cd $base/ftp; find . \! -type d \! -name 'Archive_Maintenance_In_Progress' | sort) >$ARCHLIST
351
352     rm -f sundries.list
353     zcat *.list.gz | cat - *.list | sort -u |
354     diff - $ARCHLIST | sed -n 's/^> //p' > sundries.list
355
356     log "Generating files list"
357
358     for a in $ARCHES; do
359         (echo ./project/trace; zcat arch-$a.list.gz source.list.gz) |
360         cat - sundries.list dists.list project.list docs.list indices.list |
361         sort -u | poolfirst > ../arch-$a.files
362     done
363
364     (cd $base/ftp/
365             for dist in sid squeeze; do
366                     find ./dists/$dist/main/i18n/ \! -type d | sort -u | gzip --rsyncable -9 > $base/ftp/indices/files/components/translation-$dist.list.gz
367             done
368     )
369
370     (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) |
371     sort -u | poolfirst > ../typical.files
372
373     rm -f $ARCHLIST
374     log "Done!"
375 }
376
377 function mkchecksums() {
378     dsynclist=$dbdir/dsync.list
379     md5list=$indices/md5sums
380
381     log -n "Creating md5 / dsync index file ... "
382
383     cd "$ftpdir"
384     ${bindir}/dsync-flist -q generate $dsynclist --exclude $dsynclist --md5
385     ${bindir}/dsync-flist -q md5sums $dsynclist | gzip -9n --rsyncable > ${md5list}.gz
386     ${bindir}/dsync-flist -q link-dups $dsynclist || true
387 }
388
389 function mirror() {
390     log "Regenerating \"public\" mirror/ hardlink fun"
391     cd ${mirrordir}
392     rsync -aH --link-dest ${ftpdir} --delete --delete-after --ignore-errors ${ftpdir}/. .
393 }
394
395 function expire() {
396     log "Expiring old database dumps..."
397     cd $base/backup
398     $scriptsdir/expire_dumps -d . -p -f "dump_*"
399 }
400
401 function transitionsclean() {
402     log "Removing out of date transitions..."
403     cd $base
404     dak transitions -c -a
405 }
406
407 function reports() {
408     # Send a report on NEW/BYHAND packages
409     log "Nagging ftpteam about NEW/BYHAND packages"
410     dak queue-report | mail -e -s "NEW and BYHAND on $(date +%D)" ftpmaster@ftp-master.debian.org
411     # and one on crufty packages
412     log "Sending information about crufty packages"
413     dak cruft-report > $webdir/cruft-report-daily.txt
414     dak cruft-report -s experimental >> $webdir/cruft-report-daily.txt
415     cat $webdir/cruft-report-daily.txt | mail -e -s "Debian archive cruft report for $(date +%D)" ftpmaster@ftp-master.debian.org
416 }
417
418 function dm() {
419     log "Updating DM html page"
420     $scriptsdir/dm-monitor >$webdir/dm-uploaders.html
421 }
422
423 function bts() {
424     log "Categorizing uncategorized bugs filed against ftp.debian.org"
425     dak bts-categorize
426 }
427
428 function merkel2() {
429     # Push dak@merkel so it syncs the projectb there. Returns immediately, the sync runs detached
430     log "Trigger merkel/flotows projectb sync"
431     ssh -2 -o BatchMode=yes -o SetupTimeOut=30 -o ConnectTimeout=30 -i ~/.ssh/push_merkel_projectb dak@merkel.debian.org sleep 1
432     # Also trigger flotow, the ftpmaster test box
433     ssh -2 -o BatchMode=yes -o SetupTimeOut=30 -o ConnectTimeout=30 -i ~/.ssh/push_flotow_projectb dak@flotow.debconf.org sleep 1
434 }
435
436 function merkel3() {
437     # Push dak@merkel to tell it to sync the dd accessible parts. Returns immediately, the sync runs detached
438     log "Trigger merkels dd accessible parts sync"
439     ssh -2 -o BatchMode=yes -o SetupTimeOut=30 -o ConnectTimeout=30 -i ~/.ssh/push_merkel_ddaccess dak@merkel.debian.org sleep 1
440 }
441
442 function mirrorpush() {
443     log "Starting the mirrorpush"
444     date -u > /srv/ftp.debian.org/web/mirrorstart
445     echo "Using dak v1" >> /srv/ftp.debian.org/web/mirrorstart
446     echo "Running on host $(hostname -f)" >> /srv/ftp.debian.org/web/mirrorstart
447     sudo -H -u archvsync /home/archvsync/runmirrors > ~dak/runmirrors.log 2>&1 &
448 }
449
450 function i18n2() {
451     log "Exporting package data foo for i18n project"
452     STAMP=$(date "+%Y%m%d%H%M")
453     mkdir -p ${scriptdir}/i18n/${STAMP}
454     cd ${scriptdir}/i18n/${STAMP}
455     dak control-suite -l stable > lenny
456     dak control-suite -l testing > squeeze
457     dak control-suite -l unstable > sid
458     echo "${STAMP}" > timestamp
459     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
460     rm -f md5sum
461     md5sum * > md5sum
462     cd ${webdir}/
463     ln -sfT ${scriptdir}/i18n/${STAMP} i18n
464
465     cd ${scriptdir}
466     find ./i18n -mindepth 1 -maxdepth 1 -mtime +2 -not -name "${STAMP}" -type d -print0 | xargs --no-run-if-empty -0 rm -rf
467 }
468
469 function stats() {
470     log "Updating stats data"
471     cd $configdir
472     $scriptsdir/update-ftpstats $base/log/* > $base/misc/ftpstats.data
473     R --slave --vanilla < $base/misc/ftpstats.R
474     dak stats arch-space > $webdir/arch-space
475     dak stats pkg-nums > $webdir/pkg-nums
476 }
477
478 function aptftpcleanup() {
479     log "Clean up apt-ftparchive's databases"
480     cd $configdir
481     apt-ftparchive -q clean apt.conf
482 }
483
484 function compress() {
485     log "Compress old psql backups"
486     cd $base/backup/
487     find -maxdepth 1 -mindepth 1 -type f -name 'dump_pre_*' -mtime +2 -print0 | xargs -0 --no-run-if-empty rm
488
489     find -maxdepth 1 -mindepth 1 -type f -name 'dump_*' \! -name '*.bz2' \! -name '*.gz' -mmin +720 |
490     while read dumpname; do
491         echo "Compressing $dumpname"
492         bzip2 -9fv "$dumpname"
493     done
494     find -maxdepth 1 -mindepth 1 -type f -name "dumpall_*" \! -name '*.bz2' \! -name '*.gz' -mmin +720 |
495     while read dumpname; do
496         echo "Compressing $dumpname"
497         bzip2 -9fv "$dumpname"
498     done
499     finddup -l -d $base/backup
500 }
501
502 function logstats() {
503     $masterdir/tools/logs.py "$1"
504 }
505
506 # save timestamp when we start
507 function savetimestamp() {
508         NOW=`date "+%Y.%m.%d-%H:%M:%S"`
509         echo ${NOW} > "${dbdir}/dinstallstart"
510 }
511
512 function maillogfile() {
513     cat "$LOGFILE" | mail -s "Log for dinstall run of ${NOW}" cron@ftp-master.debian.org
514 }
515
516 function renamelogfile() {
517     if [ -f "${dbdir}/dinstallstart" ]; then
518         NOW=$(cat "${dbdir}/dinstallstart")
519 #        maillogfile
520         mv "$LOGFILE" "$logdir/dinstall_${NOW}.log"
521         logstats "$logdir/dinstall_${NOW}.log"
522         bzip2 -9 "$logdir/dinstall_${NOW}.log"
523     else
524         error "Problem, I don't know when dinstall started, unable to do log statistics."
525         NOW=`date "+%Y.%m.%d-%H:%M:%S"`
526 #        maillogfile
527         mv "$LOGFILE" "$logdir/dinstall_${NOW}.log"
528         bzip2 -9 "$logdir/dinstall_${NOW}.log"
529     fi
530 }
531
532 function testingsourcelist() {
533     dak ls -s testing -f heidi -r .| egrep 'source$' > ${webdir}/testing.list
534 }
535
536 # do a last run of process-unchecked before dinstall is on.
537 function process_unchecked() {
538     log "Processing the unchecked queue"
539     UNCHECKED_WITHOUT_LOCK="-p"
540     do_unchecked
541     sync_debbugs
542 }
543
544 # Function to update a "statefile" telling people what we are doing
545 # (more or less).
546 #
547 # This should be called with the argument(s)
548 #  - Status name we want to show.
549 #
550 function state() {
551     RIGHTNOW="$(date -u +"%a %b %d %T %Z %Y (%s)")"
552     cat >"${DINSTALLSTATE}" <<EOF
553 Dinstall start: ${DINSTALLBEGIN}
554 Current action: ${1}
555 Action start: ${RIGHTNOW}
556 EOF
557 }