1 # Timestamp. Used for dinstall stat graphs
3 echo "Archive maintenance timestamp ($1): $(date +%H:%M:%S)"
12 # If we error out this one is called, *FOLLOWED* by cleanup above
14 ERRDATE=$(date "+%Y.%m.%d-%H:%M:%S")
16 subject="ATTENTION ATTENTION!"
17 if [ "${error}" = "false" ]; then
18 subject="${subject} (continued)"
20 subject="${subject} (interrupted)"
22 subject="${subject} dinstall error at ${ERRDATE} in ${STAGEFILE} - (Be quiet, Brain, or I'll stab you with a Q-tip)"
24 cat "${STAGEFILE}.log" | mail -s "${subject}" -a "X-Debian: DAK" cron@ftp-master.debian.org
27 ########################################################################
28 # the actual dinstall functions follow #
29 ########################################################################
31 # pushing merkels QA user, part one
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
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)
43 function pgdump_post() {
44 log "Creating post-daily-cron-job backup of projectb database..."
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
53 # Load the dak-dev projectb
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
62 # Updating various files
64 log "Updating Bugs docu, Mirror list and mailing-lists.txt"
66 $scriptsdir/update-bugdoctxt
67 $scriptsdir/update-mirrorlists
68 $scriptsdir/update-mailingliststxt
69 $scriptsdir/update-pseudopackages.sh
72 # Process (oldstable)-proposed-updates "NEW" queue
76 dak process-new -a -C COMMENTS >> REPORT || true
80 log "Doing automated p-u-new processing"
84 log "Doing automated o-p-u-new processing"
88 # The first i18n one, syncing new descriptions
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
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
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/.
111 cd ${scriptdir}/i18nsync
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
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
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
128 log "Checking for cruft in overrides"
133 log "Generating suite file lists for apt-ftparchive"
134 dak make-suite-file-list
137 function fingerprints() {
138 log "Not updating fingerprints - scripts needs checking"
140 # log "Updating fingerprints"
141 # dak import-keyring -L /srv/keyring.debian.org/keyrings/debian-keyring.gpg
144 # dak import-keyring --generate-users "%s" /srv/keyring.debian.org/keyrings/debian-maintainers.gpg >"${OUTFILE}"
146 # if [ -s "${OUTFILE}" ]; then
147 # /usr/sbin/sendmail -odq -oi -t -f envelope@ftp-master.debian.org <<EOF
148 #From: Debian FTP Masters <ftpmaster@ftp-master.debian.org>
149 #To: <debian-project@lists.debian.org>
150 #Subject: Debian Maintainers Keyring changes
151 #Content-Type: text/plain; charset=utf-8
154 #The following changes to the debian-maintainers keyring have just been activated:
158 #Debian distribution maintenance software,
159 #on behalf of the Keyring maintainers
166 function overrides() {
167 log "Writing overrides into text files"
172 rm -f override.sid.all3
173 for i in main contrib non-free main.debian-installer; do cat override.sid.$i >> override.sid.all3; done
177 log "Generating package / file mapping"
178 dak make-pkg-file-mapping | bzip2 -9 > $base/ftp/indices/package-file.map.bz2
181 function packages() {
182 log "Generating Packages and Sources files"
184 GZIP='--rsyncable' ; export GZIP
185 apt-ftparchive generate apt.conf
189 log "Generating pdiff files"
190 dak generate-index-diffs
194 log "Generating Release files"
195 dak generate-releases
198 function dakcleanup() {
199 log "Cleanup old packages/files"
200 dak clean-suites -m 10000
205 # Needs to be rebuilt, as files have moved. Due to unaccepts, we need to
206 # update this before wanna-build is updated.
207 log "Regenerating wanna-build/buildd information"
208 psql projectb -A -t -q -c "SELECT build_queue.path || '/' || build_queue_files.filename FROM build_queue_files LEFT JOIN build_queue ON (build_queue.id =build_queue_files.build_queue_id) WHERE queue_name = 'buildd' AND filename ~ 'd(sc|eb)$'" > $dbdir/dists/unstable_accepted.list
209 symlinks -d /srv/incoming.debian.org/buildd > /dev/null
210 apt-ftparchive generate apt.conf.buildd
213 function buildd_dir() {
214 # Rebuilt the buildd dir to avoid long times of 403
215 log "Regenerating the buildd incoming dir"
216 STAMP=$(date "+%Y%m%d%H%M")
225 log "Removing any core files ..."
226 find -type f -name core -print0 | xargs -0r rm -v
228 log "Checking permissions on files in the FTP tree ..."
229 find -type f \( \! -perm -444 -o -perm +002 \) -ls
230 find -type d \( \! -perm -555 -o -perm +002 \) -ls
232 log "Checking symlinks ..."
235 log "Creating recursive directory listing ... "
236 rm -f .${FILENAME}.new
237 TZ=UTC ls -lR > .${FILENAME}.new
239 if [ -r ${FILENAME}.gz ] ; then
240 mv -f ${FILENAME}.gz ${FILENAME}.old.gz
241 mv -f .${FILENAME}.new ${FILENAME}
242 rm -f ${FILENAME}.patch.gz
243 zcat ${FILENAME}.old.gz | diff -u - ${FILENAME} | gzip --rsyncable -9cfn - >${FILENAME}.patch.gz
244 rm -f ${FILENAME}.old.gz
246 mv -f .${FILENAME}.new ${FILENAME}
249 gzip --rsyncable -9cfN ${FILENAME} >${FILENAME}.gz
253 function mkmaintainers() {
254 log -n 'Creating Maintainers index ... '
257 dak make-maintainers ${scriptdir}/masterfiles/pseudo-packages.maintainers | \
258 sed -e "s/~[^ ]*\([ ]\)/\1/" | awk '{printf "%-20s ", $1; for (i=2; i<=NF; i++) printf "%s ", $i; printf "\n";}' > .new-maintainers
261 cmp .new-maintainers Maintainers >/dev/null
264 if [ $rc = 1 ] || [ ! -f Maintainers ] ; then
265 log -n "installing Maintainers ... "
266 mv -f .new-maintainers Maintainers
267 gzip --rsyncable -9v <Maintainers >.new-maintainers.gz
268 mv -f .new-maintainers.gz Maintainers.gz
269 elif [ $rc = 0 ] ; then
270 log '(same as before)'
271 rm -f .new-maintainers
278 function copyoverrides() {
279 log 'Copying override files into public view ...'
281 for f in $copyoverrides ; do
283 chmod g+w override.$f
287 pc="`gzip 2>&1 -9nv <$overridedir/override.$f >.newover-$f.gz`"
290 cmp -s .newover-$f.gz $nf
295 elif [ $rc = 1 -o ! -f $nf ]; then
296 log " installing new $nf $pc"
297 mv -f .newover-$f.gz $nf
306 function mkfilesindices() {
308 cd $base/ftp/indices/files/components
312 log "Querying projectb..."
313 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
316 perl -ne 'print; while (m,/[^/]+$,) { $_=$`; print $_ . "\n" unless $d{$_}++; }'
319 perl -e '@nonpool=(); while (<>) { if (m,^\./pool/,) { print; } else { push @nonpool, $_; } } print for (@nonpool);'
322 log "Generating sources list
324 sed -n 's/|$//p' $ARCHLIST
326 find ./dists -maxdepth 1 \! -type d
327 find ./dists \! -type d | grep "/source/"
328 ) | sort -u | gzip --rsyncable -9 > source.list.gz
330 log "Generating arch lists
332 ARCHES=$( (<$ARCHLIST sed -n 's/^.*|//p'; echo amd64) | grep . | grep -v all | sort -u)
334 (sed -n "s/|$a$//p" $ARCHLIST
335 sed -n 's/|all$//p' $ARCHLIST
338 find ./dists -maxdepth 1 \! -type d
339 find ./dists \! -type d | grep -E "(proposed-updates.*_$a.changes$|/main/disks-$a/|/main/installer-$a/|/Contents-$a|/binary-$a/)"
340 ) | sort -u | gzip --rsyncable -9 > arch-$a.list.gz
343 log "Generating suite lists"
346 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
348 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
351 printf 'SELECT id, suite_name FROM suite\n' | psql -F' ' -At projectb |
352 while read id suite; do
353 [ -e $base/ftp/dists/$suite ] || continue
356 distname=$(cd dists; readlink $suite || echo $suite)
357 find ./dists/$distname \! -type d
358 for distdir in ./dists/*; do
359 [ "$(readlink $distdir)" != "$distname" ] || echo $distdir
362 suite_list $id | tr -d ' ' | sed 's,^/srv/ftp.debian.org/ftp,.,'
363 ) | sort -u | gzip --rsyncable -9 > suite-${suite}.list.gz
366 log "Finding everything on the ftp site to generate sundries"
368 (cd $base/ftp; find . \! -type d \! -name 'Archive_Maintenance_In_Progress' | sort) >$ARCHLIST
371 zcat *.list.gz | cat - *.list | sort -u |
372 diff - $ARCHLIST | sed -n 's/^> //p' > sundries.list
374 log "Generating files list"
377 (echo ./project/trace; zcat arch-$a.list.gz source.list.gz) |
378 cat - sundries.list dists.list project.list docs.list indices.list |
379 sort -u | poolfirst > ../arch-$a.files
383 for dist in sid squeeze; do
384 find ./dists/$dist/main/i18n/ \! -type d | sort -u | gzip --rsyncable -9 > $base/ftp/indices/files/components/translation-$dist.list.gz
388 (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) |
389 sort -u | poolfirst > ../typical.files
395 function mkchecksums() {
396 dsynclist=$dbdir/dsync.list
397 md5list=$indices/md5sums
399 log -n "Creating md5 / dsync index file ... "
402 ${bindir}/dsync-flist -q generate $dsynclist --exclude $dsynclist --md5
403 ${bindir}/dsync-flist -q md5sums $dsynclist | gzip -9n --rsyncable > ${md5list}.gz
404 ${bindir}/dsync-flist -q link-dups $dsynclist || true
408 log "Running various scripts from $scriptsdir"
417 log "Regenerating \"public\" mirror/ hardlink fun"
419 rsync -aH --link-dest ${ftpdir} --delete --delete-after --ignore-errors ${ftpdir}/. .
423 log "Trigger daily wanna-build run"
424 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
428 log "Expiring old database dumps..."
430 $scriptsdir/expire_dumps -d . -p -f "dump_*"
433 function transitionsclean() {
434 log "Removing out of date transitions..."
436 dak transitions -c -a
440 # Send a report on NEW/BYHAND packages
441 log "Nagging ftpteam about NEW/BYHAND packages"
442 dak queue-report | mail -e -s "NEW and BYHAND on $(date +%D)" ftpmaster@ftp-master.debian.org
443 # and one on crufty packages
444 log "Sending information about crufty packages"
445 dak cruft-report > $webdir/cruft-report-daily.txt
446 dak cruft-report -s experimental >> $webdir/cruft-report-daily.txt
447 cat $webdir/cruft-report-daily.txt | mail -e -s "Debian archive cruft report for $(date +%D)" ftpmaster@ftp-master.debian.org
451 log "Updating DM html page"
452 $scriptsdir/dm-monitor >$webdir/dm-uploaders.html
456 log "Categorizing uncategorized bugs filed against ftp.debian.org"
461 # Push dak@merkel so it syncs the projectb there. Returns immediately, the sync runs detached
462 log "Trigger merkel/flotows projectb sync"
463 ssh -2 -o BatchMode=yes -o SetupTimeOut=30 -o ConnectTimeout=30 -i ~/.ssh/push_merkel_projectb dak@merkel.debian.org sleep 1
464 # Also trigger flotow, the ftpmaster test box
465 ssh -2 -o BatchMode=yes -o SetupTimeOut=30 -o ConnectTimeout=30 -i ~/.ssh/push_flotow_projectb dak@flotow.debconf.org sleep 1
469 # Push dak@merkel to tell it to sync the dd accessible parts. Returns immediately, the sync runs detached
470 log "Trigger merkels dd accessible parts sync"
471 ssh -2 -o BatchMode=yes -o SetupTimeOut=30 -o ConnectTimeout=30 -i ~/.ssh/push_merkel_ddaccess dak@merkel.debian.org sleep 1
474 function mirrorpush() {
475 log "Starting the mirrorpush"
476 date -u > /srv/ftp.debian.org/web/mirrorstart
477 echo "Using dak v1" >> /srv/ftp.debian.org/web/mirrorstart
478 echo "Running on host $(hostname -f)" >> /srv/ftp.debian.org/web/mirrorstart
479 sudo -H -u archvsync /home/archvsync/runmirrors > ~dak/runmirrors.log 2>&1 &
483 log "Exporting package data foo for i18n project"
484 STAMP=$(date "+%Y%m%d%H%M")
485 mkdir -p ${scriptdir}/i18n/${STAMP}
486 cd ${scriptdir}/i18n/${STAMP}
487 dak control-suite -l stable > lenny
488 dak control-suite -l testing > squeeze
489 dak control-suite -l unstable > sid
490 echo "${STAMP}" > timestamp
491 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
495 ln -sfT ${scriptdir}/i18n/${STAMP} i18n
498 find ./i18n -mindepth 1 -maxdepth 1 -mtime +2 -not -name "${STAMP}" -type d -print0 | xargs --no-run-if-empty -0 rm -rf
502 log "Updating stats data"
504 $scriptsdir/update-ftpstats $base/log/* > $base/misc/ftpstats.data
505 R --slave --vanilla < $base/misc/ftpstats.R
506 dak stats arch-space > $webdir/arch-space
507 dak stats pkg-nums > $webdir/pkg-nums
510 function aptftpcleanup() {
511 log "Clean up apt-ftparchive's databases"
513 apt-ftparchive -q clean apt.conf
516 function compress() {
517 log "Compress old psql backups"
519 find -maxdepth 1 -mindepth 1 -type f -name 'dump_pre_*' -mtime +2 -print0 | xargs -0 --no-run-if-empty rm
521 find -maxdepth 1 -mindepth 1 -type f -name 'dump_*' \! -name '*.bz2' \! -name '*.gz' -mmin +720 |
522 while read dumpname; do
523 echo "Compressing $dumpname"
524 bzip2 -9fv "$dumpname"
526 find -maxdepth 1 -mindepth 1 -type f -name "dumpall_*" \! -name '*.bz2' \! -name '*.gz' -mmin +720 |
527 while read dumpname; do
528 echo "Compressing $dumpname"
529 bzip2 -9fv "$dumpname"
531 finddup -l -d $base/backup
534 function logstats() {
535 $masterdir/tools/logs.py "$1"
538 # save timestamp when we start
539 function savetimestamp() {
540 NOW=`date "+%Y.%m.%d-%H:%M:%S"`
541 echo ${NOW} > "${dbdir}/dinstallstart"
544 function maillogfile() {
545 cat "$LOGFILE" | mail -s "Log for dinstall run of ${NOW}" cron@ftp-master.debian.org
548 function renamelogfile() {
549 if [ -f "${dbdir}/dinstallstart" ]; then
550 NOW=$(cat "${dbdir}/dinstallstart")
552 mv "$LOGFILE" "$logdir/dinstall_${NOW}.log"
553 logstats "$logdir/dinstall_${NOW}.log"
554 bzip2 -9 "$logdir/dinstall_${NOW}.log"
556 error "Problem, I don't know when dinstall started, unable to do log statistics."
557 NOW=`date "+%Y.%m.%d-%H:%M:%S"`
559 mv "$LOGFILE" "$logdir/dinstall_${NOW}.log"
560 bzip2 -9 "$logdir/dinstall_${NOW}.log"
564 function testingsourcelist() {
565 dak ls -s testing -f heidi -r .| egrep 'source$' > ${webdir}/testing.list
568 # do a last run of process-unchecked before dinstall is on.
569 function process_unchecked() {
570 log "Processing the unchecked queue"
571 UNCHECKED_WITHOUT_LOCK="-p"