]> git.decadent.org.uk Git - dak.git/blob - config/debian/dinstall.functions
fix variable references
[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 wb() {
396     log "Trigger daily wanna-build run"
397     wbtrigger "daily"
398 }
399
400 function expire() {
401     log "Expiring old database dumps..."
402     cd $base/backup
403     $scriptsdir/expire_dumps -d . -p -f "dump_*"
404 }
405
406 function transitionsclean() {
407     log "Removing out of date transitions..."
408     cd $base
409     dak transitions -c -a
410 }
411
412 function reports() {
413     # Send a report on NEW/BYHAND packages
414     log "Nagging ftpteam about NEW/BYHAND packages"
415     dak queue-report | mail -e -s "NEW and BYHAND on $(date +%D)" ftpmaster@ftp-master.debian.org
416     # and one on crufty packages
417     log "Sending information about crufty packages"
418     dak cruft-report > $webdir/cruft-report-daily.txt
419     dak cruft-report -s experimental >> $webdir/cruft-report-daily.txt
420     cat $webdir/cruft-report-daily.txt | mail -e -s "Debian archive cruft report for $(date +%D)" ftpmaster@ftp-master.debian.org
421 }
422
423 function dm() {
424     log "Updating DM html page"
425     $scriptsdir/dm-monitor >$webdir/dm-uploaders.html
426 }
427
428 function bts() {
429     log "Categorizing uncategorized bugs filed against ftp.debian.org"
430     dak bts-categorize
431 }
432
433 function merkel2() {
434     # Push dak@merkel so it syncs the projectb there. Returns immediately, the sync runs detached
435     log "Trigger merkel/flotows projectb sync"
436     ssh -2 -o BatchMode=yes -o SetupTimeOut=30 -o ConnectTimeout=30 -i ~/.ssh/push_merkel_projectb dak@merkel.debian.org sleep 1
437     # Also trigger flotow, the ftpmaster test box
438     ssh -2 -o BatchMode=yes -o SetupTimeOut=30 -o ConnectTimeout=30 -i ~/.ssh/push_flotow_projectb dak@flotow.debconf.org sleep 1
439 }
440
441 function merkel3() {
442     # Push dak@merkel to tell it to sync the dd accessible parts. Returns immediately, the sync runs detached
443     log "Trigger merkels dd accessible parts sync"
444     ssh -2 -o BatchMode=yes -o SetupTimeOut=30 -o ConnectTimeout=30 -i ~/.ssh/push_merkel_ddaccess dak@merkel.debian.org sleep 1
445 }
446
447 function mirrorpush() {
448     log "Starting the mirrorpush"
449     date -u > /srv/ftp.debian.org/web/mirrorstart
450     echo "Using dak v1" >> /srv/ftp.debian.org/web/mirrorstart
451     echo "Running on host $(hostname -f)" >> /srv/ftp.debian.org/web/mirrorstart
452     sudo -H -u archvsync /home/archvsync/runmirrors > ~dak/runmirrors.log 2>&1 &
453 }
454
455 function i18n2() {
456     log "Exporting package data foo for i18n project"
457     STAMP=$(date "+%Y%m%d%H%M")
458     mkdir -p ${scriptdir}/i18n/${STAMP}
459     cd ${scriptdir}/i18n/${STAMP}
460     dak control-suite -l stable > lenny
461     dak control-suite -l testing > squeeze
462     dak control-suite -l unstable > sid
463     echo "${STAMP}" > timestamp
464     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
465     rm -f md5sum
466     md5sum * > md5sum
467     cd ${webdir}/
468     ln -sfT ${scriptdir}/i18n/${STAMP} i18n
469
470     cd ${scriptdir}
471     find ./i18n -mindepth 1 -maxdepth 1 -mtime +2 -not -name "${STAMP}" -type d -print0 | xargs --no-run-if-empty -0 rm -rf
472 }
473
474 function stats() {
475     log "Updating stats data"
476     cd $configdir
477     $scriptsdir/update-ftpstats $base/log/* > $base/misc/ftpstats.data
478     R --slave --vanilla < $base/misc/ftpstats.R
479     dak stats arch-space > $webdir/arch-space
480     dak stats pkg-nums > $webdir/pkg-nums
481 }
482
483 function aptftpcleanup() {
484     log "Clean up apt-ftparchive's databases"
485     cd $configdir
486     apt-ftparchive -q clean apt.conf
487 }
488
489 function compress() {
490     log "Compress old psql backups"
491     cd $base/backup/
492     find -maxdepth 1 -mindepth 1 -type f -name 'dump_pre_*' -mtime +2 -print0 | xargs -0 --no-run-if-empty rm
493
494     find -maxdepth 1 -mindepth 1 -type f -name 'dump_*' \! -name '*.bz2' \! -name '*.gz' -mmin +720 |
495     while read dumpname; do
496         echo "Compressing $dumpname"
497         bzip2 -9fv "$dumpname"
498     done
499     find -maxdepth 1 -mindepth 1 -type f -name "dumpall_*" \! -name '*.bz2' \! -name '*.gz' -mmin +720 |
500     while read dumpname; do
501         echo "Compressing $dumpname"
502         bzip2 -9fv "$dumpname"
503     done
504     finddup -l -d $base/backup
505 }
506
507 function logstats() {
508     $masterdir/tools/logs.py "$1"
509 }
510
511 # save timestamp when we start
512 function savetimestamp() {
513         NOW=`date "+%Y.%m.%d-%H:%M:%S"`
514         echo ${NOW} > "${dbdir}/dinstallstart"
515 }
516
517 function maillogfile() {
518     cat "$LOGFILE" | mail -s "Log for dinstall run of ${NOW}" cron@ftp-master.debian.org
519 }
520
521 function renamelogfile() {
522     if [ -f "${dbdir}/dinstallstart" ]; then
523         NOW=$(cat "${dbdir}/dinstallstart")
524 #        maillogfile
525         mv "$LOGFILE" "$logdir/dinstall_${NOW}.log"
526         logstats "$logdir/dinstall_${NOW}.log"
527         bzip2 -9 "$logdir/dinstall_${NOW}.log"
528     else
529         error "Problem, I don't know when dinstall started, unable to do log statistics."
530         NOW=`date "+%Y.%m.%d-%H:%M:%S"`
531 #        maillogfile
532         mv "$LOGFILE" "$logdir/dinstall_${NOW}.log"
533         bzip2 -9 "$logdir/dinstall_${NOW}.log"
534     fi
535 }
536
537 function testingsourcelist() {
538     dak ls -s testing -f heidi -r .| egrep 'source$' > ${webdir}/testing.list
539 }
540
541 # do a last run of process-unchecked before dinstall is on.
542 function process_unchecked() {
543     log "Processing the unchecked queue"
544     UNCHECKED_WITHOUT_LOCK="-p"
545     do_unchecked
546     sync_debbugs
547 }