]> git.decadent.org.uk Git - dak.git/blob - config/debian/dinstall.functions
update scripts for new world order
[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 msfl() {
133     log "Generating suite file lists for apt-ftparchive"
134     dak make-suite-file-list
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 -n 'Creating Maintainers index ... '
251
252     cd $indices
253     dak make-maintainers ${scriptdir}/masterfiles/pseudo-packages.maintainers | \
254         sed -e "s/~[^  ]*\([   ]\)/\1/"  | awk '{printf "%-20s ", $1; for (i=2; i<=NF; i++) printf "%s ", $i; printf "\n";}' > .new-maintainers
255
256     set +e
257     cmp .new-maintainers Maintainers >/dev/null
258     rc=$?
259     set -e
260     if [ $rc = 1 ] || [ ! -f Maintainers ] ; then
261             log -n "installing Maintainers ... "
262             mv -f .new-maintainers Maintainers
263             gzip --rsyncable -9v <Maintainers >.new-maintainers.gz
264             mv -f .new-maintainers.gz Maintainers.gz
265     elif [ $rc = 0 ] ; then
266             log '(same as before)'
267             rm -f .new-maintainers
268     else
269             log cmp returned $rc
270             false
271     fi
272 }
273
274 function copyoverrides() {
275     log 'Copying override files into public view ...'
276
277     for f in $copyoverrides ; do
278             cd $overridedir
279             chmod g+w override.$f
280
281             cd $indices
282             rm -f .newover-$f.gz
283             pc="`gzip 2>&1 -9nv <$overridedir/override.$f >.newover-$f.gz`"
284             set +e
285             nf=override.$f.gz
286             cmp -s .newover-$f.gz $nf
287             rc=$?
288             set -e
289         if [ $rc = 0 ]; then
290                     rm -f .newover-$f.gz
291             elif [ $rc = 1 -o ! -f $nf ]; then
292                     log "   installing new $nf $pc"
293                     mv -f .newover-$f.gz $nf
294                     chmod g+w $nf
295             else
296                     log $? $pc
297                     exit 1
298             fi
299     done
300 }
301
302 function mkfilesindices() {
303     umask 002
304     cd $base/ftp/indices/files/components
305
306     ARCHLIST=$(tempfile)
307
308     log "Querying projectb..."
309     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
310
311     includedirs () {
312         perl -ne 'print; while (m,/[^/]+$,) { $_=$`; print $_ . "\n" unless $d{$_}++; }'
313     }
314     poolfirst () {
315         perl -e '@nonpool=(); while (<>) { if (m,^\./pool/,) { print; } else { push @nonpool, $_; } } print for (@nonpool);'
316     }
317
318     log "Generating sources list
319     (
320         sed -n 's/|$//p' $ARCHLIST
321         cd $base/ftp
322         find ./dists -maxdepth 1 \! -type d
323         find ./dists \! -type d | grep "/source/"
324     ) | sort -u | gzip --rsyncable -9 > source.list.gz
325
326     log "Generating arch lists
327
328     ARCHES=$( (<$ARCHLIST sed -n 's/^.*|//p'; echo amd64) | grep . | grep -v all | sort -u)
329     for a in $ARCHES; do
330         (sed -n "s/|$a$//p" $ARCHLIST
331             sed -n 's/|all$//p' $ARCHLIST
332
333             cd $base/ftp
334             find ./dists -maxdepth 1 \! -type d
335             find ./dists \! -type d | grep -E "(proposed-updates.*_$a.changes$|/main/disks-$a/|/main/installer-$a/|/Contents-$a|/binary-$a/)"
336         ) | sort -u | gzip --rsyncable -9 > arch-$a.list.gz
337     done
338
339     log "Generating suite lists"
340
341     suite_list () {
342         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
343
344         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
345     }
346
347     printf 'SELECT id, suite_name FROM suite\n' | psql -F' ' -At projectb |
348     while read id suite; do
349         [ -e $base/ftp/dists/$suite ] || continue
350         (
351             (cd $base/ftp
352                 distname=$(cd dists; readlink $suite || echo $suite)
353                 find ./dists/$distname \! -type d
354                 for distdir in ./dists/*; do
355                     [ "$(readlink $distdir)" != "$distname" ] || echo $distdir
356                 done
357             )
358             suite_list $id | tr -d ' ' | sed 's,^/srv/ftp.debian.org/ftp,.,'
359         ) | sort -u | gzip --rsyncable -9 > suite-${suite}.list.gz
360     done
361
362     log "Finding everything on the ftp site to generate sundries"
363
364     (cd $base/ftp; find . \! -type d \! -name 'Archive_Maintenance_In_Progress' | sort) >$ARCHLIST
365
366     rm -f sundries.list
367     zcat *.list.gz | cat - *.list | sort -u |
368     diff - $ARCHLIST | sed -n 's/^> //p' > sundries.list
369
370     log "Generating files list"
371
372     for a in $ARCHES; do
373         (echo ./project/trace; zcat arch-$a.list.gz source.list.gz) |
374         cat - sundries.list dists.list project.list docs.list indices.list |
375         sort -u | poolfirst > ../arch-$a.files
376     done
377
378     (cd $base/ftp/
379             for dist in sid squeeze; do
380                     find ./dists/$dist/main/i18n/ \! -type d | sort -u | gzip --rsyncable -9 > $base/ftp/indices/files/components/translation-$dist.list.gz
381             done
382     )
383
384     (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) |
385     sort -u | poolfirst > ../typical.files
386
387     rm -f $ARCHLIST
388     log "Done!"
389 }
390
391 function mkchecksums() {
392     dsynclist=$dbdir/dsync.list
393     md5list=$indices/md5sums
394
395     log -n "Creating md5 / dsync index file ... "
396
397     cd "$ftpdir"
398     ${bindir}/dsync-flist -q generate $dsynclist --exclude $dsynclist --md5
399     ${bindir}/dsync-flist -q md5sums $dsynclist | gzip -9n --rsyncable > ${md5list}.gz
400     ${bindir}/dsync-flist -q link-dups $dsynclist || true
401 }
402
403 function scripts() {
404     log "Running various scripts from $scriptsdir"
405     mkmaintainers
406     copyoverrides
407     mklslar
408     mkfilesindices
409     mkchecksums
410 }
411
412 function mirror() {
413     log "Regenerating \"public\" mirror/ hardlink fun"
414     cd ${mirrordir}
415     rsync -aH --link-dest ${ftpdir} --delete --delete-after --ignore-errors ${ftpdir}/. .
416 }
417
418 function wb() {
419     log "Trigger daily wanna-build run"
420     ssh -o BatchMode=yes -o SetupTimeOut=90 -o ConnectTimeout=90 wbadm@buildd /org/wanna-build/trigger.daily || echo "W-B trigger.daily failed" | mail -s "W-B Daily trigger failed" ftpmaster@ftp-master.debian.org
421 }
422
423 function expire() {
424     log "Expiring old database dumps..."
425     cd $base/backup
426     $scriptsdir/expire_dumps -d . -p -f "dump_*"
427 }
428
429 function transitionsclean() {
430     log "Removing out of date transitions..."
431     cd $base
432     dak transitions -c -a
433 }
434
435 function reports() {
436     # Send a report on NEW/BYHAND packages
437     log "Nagging ftpteam about NEW/BYHAND packages"
438     dak queue-report | mail -e -s "NEW and BYHAND on $(date +%D)" ftpmaster@ftp-master.debian.org
439     # and one on crufty packages
440     log "Sending information about crufty packages"
441     dak cruft-report > $webdir/cruft-report-daily.txt
442     dak cruft-report -s experimental >> $webdir/cruft-report-daily.txt
443     cat $webdir/cruft-report-daily.txt | mail -e -s "Debian archive cruft report for $(date +%D)" ftpmaster@ftp-master.debian.org
444 }
445
446 function dm() {
447     log "Updating DM html page"
448     $scriptsdir/dm-monitor >$webdir/dm-uploaders.html
449 }
450
451 function bts() {
452     log "Categorizing uncategorized bugs filed against ftp.debian.org"
453     dak bts-categorize
454 }
455
456 function merkel2() {
457     # Push dak@merkel so it syncs the projectb there. Returns immediately, the sync runs detached
458     log "Trigger merkel/flotows projectb sync"
459     ssh -2 -o BatchMode=yes -o SetupTimeOut=30 -o ConnectTimeout=30 -i ~/.ssh/push_merkel_projectb dak@merkel.debian.org sleep 1
460     # Also trigger flotow, the ftpmaster test box
461     ssh -2 -o BatchMode=yes -o SetupTimeOut=30 -o ConnectTimeout=30 -i ~/.ssh/push_flotow_projectb dak@flotow.debconf.org sleep 1
462 }
463
464 function merkel3() {
465     # Push dak@merkel to tell it to sync the dd accessible parts. Returns immediately, the sync runs detached
466     log "Trigger merkels dd accessible parts sync"
467     ssh -2 -o BatchMode=yes -o SetupTimeOut=30 -o ConnectTimeout=30 -i ~/.ssh/push_merkel_ddaccess dak@merkel.debian.org sleep 1
468 }
469
470 function mirrorpush() {
471     log "Starting the mirrorpush"
472     date -u > /srv/ftp.debian.org/web/mirrorstart
473     echo "Using dak v1" >> /srv/ftp.debian.org/web/mirrorstart
474     echo "Running on host $(hostname -f)" >> /srv/ftp.debian.org/web/mirrorstart
475     sudo -H -u archvsync /home/archvsync/runmirrors > ~dak/runmirrors.log 2>&1 &
476 }
477
478 function i18n2() {
479     log "Exporting package data foo for i18n project"
480     STAMP=$(date "+%Y%m%d%H%M")
481     mkdir -p ${scriptdir}/i18n/${STAMP}
482     cd ${scriptdir}/i18n/${STAMP}
483     dak control-suite -l stable > lenny
484     dak control-suite -l testing > squeeze
485     dak control-suite -l unstable > sid
486     echo "${STAMP}" > timestamp
487     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
488     rm -f md5sum
489     md5sum * > md5sum
490     cd ${webdir}/
491     ln -sfT ${scriptdir}/i18n/${STAMP} i18n
492
493     cd ${scriptdir}
494     find ./i18n -mindepth 1 -maxdepth 1 -mtime +2 -not -name "${STAMP}" -type d -print0 | xargs --no-run-if-empty -0 rm -rf
495 }
496
497 function stats() {
498     log "Updating stats data"
499     cd $configdir
500     $scriptsdir/update-ftpstats $base/log/* > $base/misc/ftpstats.data
501     R --slave --vanilla < $base/misc/ftpstats.R
502     dak stats arch-space > $webdir/arch-space
503     dak stats pkg-nums > $webdir/pkg-nums
504 }
505
506 function aptftpcleanup() {
507     log "Clean up apt-ftparchive's databases"
508     cd $configdir
509     apt-ftparchive -q clean apt.conf
510 }
511
512 function compress() {
513     log "Compress old psql backups"
514     cd $base/backup/
515     find -maxdepth 1 -mindepth 1 -type f -name 'dump_pre_*' -mtime +2 -print0 | xargs -0 --no-run-if-empty rm
516
517     find -maxdepth 1 -mindepth 1 -type f -name 'dump_*' \! -name '*.bz2' \! -name '*.gz' -mmin +720 |
518     while read dumpname; do
519         echo "Compressing $dumpname"
520         bzip2 -9fv "$dumpname"
521     done
522     find -maxdepth 1 -mindepth 1 -type f -name "dumpall_*" \! -name '*.bz2' \! -name '*.gz' -mmin +720 |
523     while read dumpname; do
524         echo "Compressing $dumpname"
525         bzip2 -9fv "$dumpname"
526     done
527     finddup -l -d $base/backup
528 }
529
530 function logstats() {
531     $masterdir/tools/logs.py "$1"
532 }
533
534 # save timestamp when we start
535 function savetimestamp() {
536         NOW=`date "+%Y.%m.%d-%H:%M:%S"`
537         echo ${NOW} > "${dbdir}/dinstallstart"
538 }
539
540 function maillogfile() {
541     cat "$LOGFILE" | mail -s "Log for dinstall run of ${NOW}" cron@ftp-master.debian.org
542 }
543
544 function renamelogfile() {
545     if [ -f "${dbdir}/dinstallstart" ]; then
546         NOW=$(cat "${dbdir}/dinstallstart")
547 #        maillogfile
548         mv "$LOGFILE" "$logdir/dinstall_${NOW}.log"
549         logstats "$logdir/dinstall_${NOW}.log"
550         bzip2 -9 "$logdir/dinstall_${NOW}.log"
551     else
552         error "Problem, I don't know when dinstall started, unable to do log statistics."
553         NOW=`date "+%Y.%m.%d-%H:%M:%S"`
554 #        maillogfile
555         mv "$LOGFILE" "$logdir/dinstall_${NOW}.log"
556         bzip2 -9 "$logdir/dinstall_${NOW}.log"
557     fi
558 }
559
560 function testingsourcelist() {
561     dak ls -s testing -f heidi -r .| egrep 'source$' > ${webdir}/testing.list
562 }
563
564 # do a last run of process-unchecked before dinstall is on.
565 function process_unchecked() {
566     log "Processing the unchecked queue"
567     UNCHECKED_WITHOUT_LOCK="-p"
568     do_unchecked
569     sync_debbugs
570 }