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