]> git.decadent.org.uk Git - dak.git/blobdiff - config/debian/dinstall.functions
Stop generating dm-uploaders.html.
[dak.git] / config / debian / dinstall.functions
index cb772fd32dabc2d64f781fc11a5a5ead32edb32b..4836f53816d10f9049f07e8b47691e9d27a57c2f 100644 (file)
@@ -4,10 +4,14 @@ function ts() {
         echo "Archive maintenance timestamp ($1): $(date +%H:%M:%S)"
 }
 
         echo "Archive maintenance timestamp ($1): $(date +%H:%M:%S)"
 }
 
-# Cleanup actions
-function cleanup() {
-       rm -f ${LOCK_DAILY}
-       rm -f ${LOCK_ACCEPTED}
+# Remove daily lock
+function remove_daily_lock() {
+    rm -f $LOCK_DAILY
+}
+
+# Remove all locks
+function remove_all_locks() {
+    rm -f $LOCK_DAILY $LOCK_ACCEPTED $LOCK_NEW
 }
 
 # If we error out this one is called, *FOLLOWED* by cleanup above
 }
 
 # If we error out this one is called, *FOLLOWED* by cleanup above
@@ -22,7 +26,11 @@ function onerror() {
     fi
     subject="${subject} dinstall error at ${ERRDATE} in ${STAGEFILE} - (Be quiet, Brain, or I'll stab you with a Q-tip)"
 
     fi
     subject="${subject} dinstall error at ${ERRDATE} in ${STAGEFILE} - (Be quiet, Brain, or I'll stab you with a Q-tip)"
 
-    cat "${STAGEFILE}.log" | mail -s "${subject}" -a "X-Debian: DAK" cron@ftp-master.debian.org
+    if [ -r "${STAGEFILE}.log" ]; then
+        cat "${STAGEFILE}.log"
+    else
+        echo "file ${STAGEFILE}.log does not exist, sorry"
+    fi | mail -s "${subject}" -a "X-Debian: DAK" cron@ftp-master.debian.org -- -F "Debian FTP Masters" -f ftpmaster@ftp-master.debian.org
 }
 
 ########################################################################
 }
 
 ########################################################################
@@ -30,34 +38,9 @@ function onerror() {
 ########################################################################
 
 # pushing merkels QA user, part one
 ########################################################################
 
 # pushing merkels QA user, part one
-function merkel1() {
-    log "Telling merkels QA user that we start dinstall"
-    ssh -2 -i ~dak/.ssh/push_merkel_qa  -o BatchMode=yes -o SetupTimeOut=90 -o ConnectTimeout=90 qa@merkel.debian.org sleep 1
-}
-
-# Create the postgres dump files
-function pgdump_pre() {
-    log "Creating pre-daily-cron-job backup of projectb database..."
-    pg_dump projectb > $base/backup/dump_pre_$(date +%Y.%m.%d-%H:%M:%S)
-}
-
-function pgdump_post() {
-    log "Creating post-daily-cron-job backup of projectb database..."
-    cd $base/backup
-    POSTDUMP=$(date +%Y.%m.%d-%H:%M:%S)
-    pg_dump projectb > $base/backup/dump_$POSTDUMP
-    pg_dumpall --globals-only > $base/backup/dumpall_$POSTDUMP
-    ln -sf $base/backup/dump_$POSTDUMP current
-    ln -sf $base/backup/dumpall_$POSTDUMP currentall
-}
-
-# Load the dak-dev projectb
-function pgdakdev() {
-    cd $base/backup
-    echo "drop database projectb" | psql -p 5433 template1
-       cat currentall | psql -p 5433 template1
-    createdb -p 5433 -T template0 projectb
-    fgrep -v '\connect' current | psql -p 5433 projectb
+function qa1() {
+    log "Telling QA user that we start dinstall"
+    ssh -2 -i ~dak/.ssh/push_merkel_qa  -o BatchMode=yes -o SetupTimeOut=90 -o ConnectTimeout=90 qa@qa.debian.org sleep 1
 }
 
 # Updating various files
 }
 
 # Updating various files
@@ -70,23 +53,6 @@ function updates() {
     $scriptsdir/update-pseudopackages.sh
 }
 
     $scriptsdir/update-pseudopackages.sh
 }
 
-# Process (oldstable)-proposed-updates "NEW" queue
-function punew_do() {
-    date -u -R >> REPORT
-    dak process-policy $1 | tee -a REPORT | mail -e -s "NEW changes in $1" debian-release@lists.debian.org
-    echo >> REPORT
-}
-function punew() {
-    log "Doing automated p-u-new processing"
-    cd "${queuedir}/p-u-new"
-    punew_do "$1"
-}
-function opunew() {
-    log "Doing automated o-p-u-new processing"
-    cd "${queuedir}/o-p-u-new"
-    punew_do "$1"
-}
-
 # The first i18n one, syncing new descriptions
 function i18n1() {
     log "Synchronizing i18n package descriptions"
 # The first i18n one, syncing new descriptions
 function i18n1() {
     log "Synchronizing i18n package descriptions"
@@ -96,7 +62,7 @@ function i18n1() {
 
     # Now check if we still know about the packages for which they created the files
     # is the timestamp signed by us?
 
     # Now check if we still know about the packages for which they created the files
     # is the timestamp signed by us?
-    if $(gpgv --keyring /srv/ftp.debian.org/s3kr1t/dot-gnupg/pubring.gpg timestamp.gpg timestamp); then
+    if $(gpgv --keyring /srv/ftp-master.debian.org/s3kr1t/dot-gnupg/pubring.gpg timestamp.gpg timestamp); then
         # now read it. As its signed by us we are sure the content is what we expect, no need
         # to do more here. And we only test -d a directory on it anyway.
         TSTAMP=$(cat timestamp)
         # now read it. As its signed by us we are sure the content is what we expect, no need
         # to do more here. And we only test -d a directory on it anyway.
         TSTAMP=$(cat timestamp)
@@ -105,24 +71,24 @@ function i18n1() {
             # Lets check!
             if ${scriptsdir}/ddtp-i18n-check.sh . ${scriptdir}/i18n/${TSTAMP}; then
                 # Yay, worked, lets copy around
             # Lets check!
             if ${scriptsdir}/ddtp-i18n-check.sh . ${scriptdir}/i18n/${TSTAMP}; then
                 # Yay, worked, lets copy around
-                for dir in squeeze sid; do
+                for dir in wheezy sid; do
                     if [ -d dists/${dir}/ ]; then
                         cd dists/${dir}/main/i18n
                     if [ -d dists/${dir}/ ]; then
                         cd dists/${dir}/main/i18n
-                        rsync -aq --delete --delete-after  . ${ftpdir}/dists/${dir}/main/i18n/.
+                        rsync -aq --delete --delete-after --exclude Translation-en.bz2 --exclude Translation-*.diff/ . ${ftpdir}/dists/${dir}/main/i18n/.
                     fi
                     cd ${scriptdir}/i18nsync
                 done
             else
                 echo "ARRRR, bad guys, wrong files, ARRR"
                     fi
                     cd ${scriptdir}/i18nsync
                 done
             else
                 echo "ARRRR, bad guys, wrong files, ARRR"
-                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
+                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
             fi
         else
             echo "ARRRR, missing the timestamp ${TSTAMP} directory, not updating i18n, ARRR"
             fi
         else
             echo "ARRRR, missing the timestamp ${TSTAMP} directory, not updating i18n, ARRR"
-            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
+            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
         fi
     else
         echo "ARRRRRRR, could not verify our timestamp signature, ARRR. Don't mess with our files, i18n guys, ARRRRR."
         fi
     else
         echo "ARRRRRRR, could not verify our timestamp signature, ARRR. Don't mess with our files, i18n guys, ARRRRR."
-        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
+        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
     fi
 }
 
     fi
 }
 
@@ -142,8 +108,6 @@ function filelist() {
 }
 
 function fingerprints() {
 }
 
 function fingerprints() {
-    log "Not updating fingerprints - scripts needs checking"
-
     log "Updating fingerprints"
     dak import-keyring -L /srv/keyring.debian.org/keyrings/debian-keyring.gpg
 
     log "Updating fingerprints"
     dak import-keyring -L /srv/keyring.debian.org/keyrings/debian-keyring.gpg
 
@@ -156,6 +120,7 @@ From: Debian FTP Masters <ftpmaster@ftp-master.debian.org>
 To: <debian-project@lists.debian.org>
 Subject: Debian Maintainers Keyring changes
 Content-Type: text/plain; charset=utf-8
 To: <debian-project@lists.debian.org>
 Subject: Debian Maintainers Keyring changes
 Content-Type: text/plain; charset=utf-8
+X-Debian: DAK
 MIME-Version: 1.0
 
 The following changes to the debian-maintainers keyring have just been activated:
 MIME-Version: 1.0
 
 The following changes to the debian-maintainers keyring have just been activated:
@@ -182,14 +147,13 @@ function overrides() {
 
 function mpfm() {
     log "Generating package / file mapping"
 
 function mpfm() {
     log "Generating package / file mapping"
-    dak make-pkg-file-mapping | bzip2 -9 > $base/ftp/indices/package-file.map.bz2
+    dak make-pkg-file-mapping ftp-master | bzip2 -9 > $base/ftp/indices/package-file.map.bz2
 }
 
 function packages() {
     log "Generating Packages and Sources files"
 }
 
 function packages() {
     log "Generating Packages and Sources files"
-    cd $configdir
-    GZIP='--rsyncable' ; export GZIP
-    apt-ftparchive generate apt.conf
+    dak generate-packages-sources2 -a ftp-master
+    dak contents generate -a ftp-master
 }
 
 function pdiff() {
 }
 
 function pdiff() {
@@ -198,14 +162,22 @@ function pdiff() {
 }
 
 function release() {
 }
 
 function release() {
+    # XXX: disable once we can remove i18n/Index (#649314)
+    log "Generating i18n/Index"
+    (
+        cd "$ftpdir/dists";
+        for dist in testing unstable experimental proposed-updates testing-proposed-updates; do
+            $scriptsdir/generate-i18n-Index $dist;
+        done
+    )
     log "Generating Release files"
     log "Generating Release files"
-    dak generate-releases
+    dak generate-releases -a ftp-master
 }
 
 function dakcleanup() {
     log "Cleanup old packages/files"
     dak clean-suites -m 10000
 }
 
 function dakcleanup() {
     log "Cleanup old packages/files"
     dak clean-suites -m 10000
-    dak clean-queues
+    dak clean-queues -i "$unchecked"
 }
 
 function buildd_dir() {
 }
 
 function buildd_dir() {
@@ -221,81 +193,57 @@ function mklslar() {
     FILENAME=ls-lR
 
     log "Removing any core files ..."
     FILENAME=ls-lR
 
     log "Removing any core files ..."
-    find -type f -name core -print0 | xargs -0r rm -v
-
-    log "Checking permissions on files in the FTP tree ..."
-    find -type f \( \! -perm -444 -o -perm +002 \) -ls
-    find -type d \( \! -perm -555 -o -perm +002 \) -ls
+    find -type f -name core -print -delete
 
     log "Checking symlinks ..."
     symlinks -rd .
 
     log "Creating recursive directory listing ... "
 
     log "Checking symlinks ..."
     symlinks -rd .
 
     log "Creating recursive directory listing ... "
-    rm -f .${FILENAME}.new
-    TZ=UTC ls -lR > .${FILENAME}.new
-
-    if [ -r ${FILENAME}.gz ] ; then
-        mv -f ${FILENAME}.gz ${FILENAME}.old.gz
-        mv -f .${FILENAME}.new ${FILENAME}
-        rm -f ${FILENAME}.patch.gz
-        zcat ${FILENAME}.old.gz | diff -u - ${FILENAME} | gzip --rsyncable -9cfn - >${FILENAME}.patch.gz
-        rm -f ${FILENAME}.old.gz
-    else
-        mv -f .${FILENAME}.new ${FILENAME}
-    fi
-
-    gzip --rsyncable -9cfN ${FILENAME} >${FILENAME}.gz
-    rm -f ${FILENAME}
+    rm -f ${FILENAME}.gz
+    TZ=UTC ls -lR | gzip -9c --rsyncable > ${FILENAME}.gz
 }
 
 function mkmaintainers() {
     log 'Creating Maintainers index ... '
 
     cd $indices
 }
 
 function mkmaintainers() {
     log 'Creating Maintainers index ... '
 
     cd $indices
-    dak make-maintainers ${scriptdir}/masterfiles/pseudo-packages.maintainers | \
-        sed -e "s/~[^  ]*\([   ]\)/\1/"  | \
-        awk '{printf "%-20s ", $1; for (i=2; i<=NF; i++) printf "%s ", $i; printf "\n";}' > .new-maintainers
-
-    if ! cmp -s .new-maintainers Maintainers || [ ! -f Maintainers ]; then
-           log "installing Maintainers ... "
-           mv -f .new-maintainers Maintainers
-           gzip --rsyncable -9v <Maintainers >.new-maintainers.gz
-           mv -f .new-maintainers.gz Maintainers.gz
-    else
-        rm -f .new-maintainers
-    fi
+    dak make-maintainers -a ftp-master ${scriptdir}/masterfiles/pseudo-packages.maintainers
+    gzip -9v --rsyncable <Maintainers >Maintainers.gz
+    gzip -9v --rsyncable <Uploaders >Uploaders.gz
 }
 
 function copyoverrides() {
     log 'Copying override files into public view ...'
 
 }
 
 function copyoverrides() {
     log 'Copying override files into public view ...'
 
-    for ofile in $copyoverrides ; do
-           cd $overridedir
-           chmod g+w override.$ofile
-
-           cd $indices
-
-           newofile=override.$ofile.gz
-           rm -f .newover-$ofile.gz
-           pc="`gzip 2>&1 -9nv <$overridedir/override.$ofile >.newover-$ofile.gz`"
-        if ! cmp -s .newover-$ofile.gz $newofile || [ ! -f $newofile ]; then
-                   log "   installing new $newofile $pc"
-                   mv -f .newover-$ofile.gz $newofile
-                   chmod g+w $newofile
-        else
-                   rm -f .newover-$ofile.gz
-           fi
+    for ofile in ${overridedir}/override.{squeeze,wheezy,sid}.{,extra.}{main,contrib,non-free}*; do
+        bname=${ofile##*/}
+        gzip -9cv --rsyncable ${ofile} > ${indices}/${bname}.gz
+        chmod g+w ${indices}/${bname}.gz
     done
 }
 
 function mkfilesindices() {
     done
 }
 
 function mkfilesindices() {
+    set +o pipefail
     umask 002
     cd $base/ftp/indices/files/components
 
     ARCHLIST=$(tempfile)
 
     umask 002
     cd $base/ftp/indices/files/components
 
     ARCHLIST=$(tempfile)
 
-    log "Querying projectb..."
-    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
+    log "Querying postgres"
+    local query="
+      SELECT './pool/' || c.name || '/' || f.filename AS path, a.arch_string AS arch_string
+      FROM files f
+      JOIN files_archive_map af ON f.id = af.file_id
+      JOIN component c ON af.component_id = c.id
+      JOIN archive ON af.archive_id = archive.id
+      LEFT OUTER JOIN
+        (binaries b
+         JOIN architecture a ON b.architecture = a.id)
+        ON f.id = b.file
+      WHERE archive.name = 'ftp-master'
+      ORDER BY path, arch_string
+    "
+    psql -At -c "$query" >$ARCHLIST
 
     includedirs () {
         perl -ne 'print; while (m,/[^/]+$,) { $_=$`; print $_ . "\n" unless $d{$_}++; }'
 
     includedirs () {
         perl -ne 'print; while (m,/[^/]+$,) { $_=$`; print $_ . "\n" unless $d{$_}++; }'
@@ -310,7 +258,7 @@ function mkfilesindices() {
         cd $base/ftp
         find ./dists -maxdepth 1 \! -type d
         find ./dists \! -type d | grep "/source/"
         cd $base/ftp
         find ./dists -maxdepth 1 \! -type d
         find ./dists \! -type d | grep "/source/"
-    ) | sort -u | gzip --rsyncable -9 > source.list.gz
+    ) | sort -u | gzip -9 > source.list.gz
 
     log "Generating arch lists"
 
 
     log "Generating arch lists"
 
@@ -322,18 +270,52 @@ function mkfilesindices() {
             cd $base/ftp
             find ./dists -maxdepth 1 \! -type d
             find ./dists \! -type d | grep -E "(proposed-updates.*_$a.changes$|/main/disks-$a/|/main/installer-$a/|/Contents-$a|/binary-$a/)"
             cd $base/ftp
             find ./dists -maxdepth 1 \! -type d
             find ./dists \! -type d | grep -E "(proposed-updates.*_$a.changes$|/main/disks-$a/|/main/installer-$a/|/Contents-$a|/binary-$a/)"
-        ) | sort -u | gzip --rsyncable -9 > arch-$a.list.gz
+        ) | sort -u | gzip -9 > arch-$a.list.gz
     done
 
     log "Generating suite lists"
 
     suite_list () {
     done
 
     log "Generating suite lists"
 
     suite_list () {
-        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
-
-        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
+       local suite_id="$(printf %d $1)"
+       local query
+       query="
+          SELECT DISTINCT './pool/' || c.name || '/' || f.filename
+          FROM
+            (SELECT sa.source AS source
+               FROM src_associations sa
+              WHERE sa.suite = $suite_id
+             UNION
+             SELECT esr.src_id
+               FROM extra_src_references esr
+               JOIN bin_associations ba ON esr.bin_id = ba.bin
+               WHERE ba.suite = $suite_id
+             UNION
+             SELECT b.source AS source
+               FROM bin_associations ba
+               JOIN binaries b ON ba.bin = b.id WHERE ba.suite = $suite_id) s
+            JOIN dsc_files df ON s.source = df.source
+            JOIN files f ON df.file = f.id
+            JOIN files_archive_map af ON f.id = af.file_id
+            JOIN component c ON af.component_id = c.id
+            JOIN archive ON af.archive_id = archive.id
+            WHERE archive.name = 'ftp-master'
+        "
+       psql -F' ' -A -t -c "$query"
+
+       query="
+          SELECT './pool/' || c.name || '/' || f.filename
+          FROM bin_associations ba
+          JOIN binaries b ON ba.bin = b.id
+          JOIN files f ON b.file = f.id
+          JOIN files_archive_map af ON f.id = af.file_id
+          JOIN component c ON af.component_id = c.id
+          JOIN archive ON af.archive_id = archive.id
+          WHERE ba.suite = $suite_id AND archive.name = 'ftp-master'
+        "
+       psql -F' ' -A -t -c "$query"
     }
 
     }
 
-    printf 'SELECT id, suite_name FROM suite\n' | psql -F' ' -At projectb |
+    psql -F' ' -At -c "SELECT id, suite_name FROM suite" |
     while read id suite; do
         [ -e $base/ftp/dists/$suite ] || continue
         (
     while read id suite; do
         [ -e $base/ftp/dists/$suite ] || continue
         (
@@ -344,8 +326,8 @@ function mkfilesindices() {
                     [ "$(readlink $distdir)" != "$distname" ] || echo $distdir
                 done
             )
                     [ "$(readlink $distdir)" != "$distname" ] || echo $distdir
                 done
             )
-            suite_list $id | tr -d ' ' | sed 's,^/srv/ftp.debian.org/ftp,.,'
-        ) | sort -u | gzip --rsyncable -9 > suite-${suite}.list.gz
+            suite_list $id
+        ) | sort -u | gzip -9 > suite-${suite}.list.gz
     done
 
     log "Finding everything on the ftp site to generate sundries"
     done
 
     log "Finding everything on the ftp site to generate sundries"
@@ -364,16 +346,17 @@ function mkfilesindices() {
     done
 
     (cd $base/ftp/
     done
 
     (cd $base/ftp/
-           for dist in sid squeeze; do
-                   find ./dists/$dist/main/i18n/ \! -type d | sort -u | gzip --rsyncable -9 > $base/ftp/indices/files/components/translation-$dist.list.gz
+           for dist in sid wheezy; do
+                   find ./dists/$dist/main/i18n/ \! -type d | sort -u | gzip -9 > $base/ftp/indices/files/components/translation-$dist.list.gz
            done
     )
 
            done
     )
 
-    (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) |
+    (cat ../arch-i386.files ../arch-amd64.files; zcat suite-proposed-updates.list.gz ; zcat translation-sid.list.gz ; zcat translation-wheezy.list.gz) |
     sort -u | poolfirst > ../typical.files
 
     rm -f $ARCHLIST
     log "Done!"
     sort -u | poolfirst > ../typical.files
 
     rm -f $ARCHLIST
     log "Done!"
+    set -o pipefail
 }
 
 function mkchecksums() {
 }
 
 function mkchecksums() {
@@ -384,7 +367,7 @@ function mkchecksums() {
 
     cd "$ftpdir"
     ${bindir}/dsync-flist -q generate $dsynclist --exclude $dsynclist --md5
 
     cd "$ftpdir"
     ${bindir}/dsync-flist -q generate $dsynclist --exclude $dsynclist --md5
-    ${bindir}/dsync-flist -q md5sums $dsynclist | gzip -9n --rsyncable > ${md5list}.gz
+    ${bindir}/dsync-flist -q md5sums $dsynclist | gzip -9n > ${md5list}.gz
     ${bindir}/dsync-flist -q link-dups $dsynclist || true
 }
 
     ${bindir}/dsync-flist -q link-dups $dsynclist || true
 }
 
@@ -402,7 +385,7 @@ function mirror() {
     echo "Running on host: $(hostname -f)" >> ${TRACEFILE}
     echo "Archive serial: ${SERIAL}" >> ${TRACEFILE}
     cd ${mirrordir}
     echo "Running on host: $(hostname -f)" >> ${TRACEFILE}
     echo "Archive serial: ${SERIAL}" >> ${TRACEFILE}
     cd ${mirrordir}
-    rsync -aH --link-dest ${ftpdir} --delete --delete-after --ignore-errors ${ftpdir}/. .
+    rsync -aH --link-dest ${ftpdir} --delete --delete-after --delete-excluded --exclude Packages.*.new --exclude Sources.*.new  --ignore-errors ${ftpdir}/. .
 }
 
 function expire() {
 }
 
 function expire() {
@@ -417,20 +400,9 @@ function transitionsclean() {
     dak transitions -c -a
 }
 
     dak transitions -c -a
 }
 
-function reports() {
-    # Send a report on NEW/BYHAND packages
-    log "Nagging ftpteam about NEW/BYHAND packages"
-    dak queue-report | mail -e -s "NEW and BYHAND on $(date +%D)" ftpmaster@ftp-master.debian.org
-    # and one on crufty packages
-    log "Sending information about crufty packages"
-    dak cruft-report > $webdir/cruft-report-daily.txt
-    dak cruft-report -s experimental >> $webdir/cruft-report-daily.txt
-    cat $webdir/cruft-report-daily.txt | mail -e -s "Debian archive cruft report for $(date +%D)" ftpmaster@ftp-master.debian.org
-}
-
 function dm() {
 function dm() {
-    log "Updating DM html page"
-    $scriptsdir/dm-monitor >$webdir/dm-uploaders.html
+    log "Updating DM permissions page"
+    dak acl export-per-source dm >$exportdir/dm.txt
 }
 
 function bts() {
 }
 
 function bts() {
@@ -438,21 +410,60 @@ function bts() {
     dak bts-categorize
 }
 
     dak bts-categorize
 }
 
-function merkel2() {
-    # Push dak@merkel so it syncs the projectb there. Returns immediately, the sync runs detached
-    log "Trigger merkel/flotows projectb sync"
-    ssh -2 -o BatchMode=yes -o SetupTimeOut=30 -o ConnectTimeout=30 -i ~/.ssh/push_merkel_projectb dak@merkel.debian.org sleep 1
-    # Also trigger flotow, the ftpmaster test box
-    ssh -2 -o BatchMode=yes -o SetupTimeOut=30 -o ConnectTimeout=30 -i ~/.ssh/push_flotow_projectb dak@flotow.debconf.org sleep 1
-}
-
-function merkel3() {
-    # Push dak@merkel to tell it to sync the dd accessible parts. Returns immediately, the sync runs detached
-    log "Trigger merkels dd accessible parts sync"
-    ssh -2 -o BatchMode=yes -o SetupTimeOut=30 -o ConnectTimeout=30 -i ~/.ssh/push_merkel_ddaccess dak@merkel.debian.org sleep 1
+function ddaccess() {
+    # Tell our dd accessible mirror to sync itself up. Including ftp dir.
+    log "Trigger dd accessible parts sync including ftp dir"
+    ${scriptsdir}/sync-dd ries-sync ries-sync1 ries-sync2 pool
 }
 
 function mirrorpush() {
 }
 
 function mirrorpush() {
+    log "Checking the public archive copy"
+    cd ${mirrordir}/dists
+
+    broken=0
+    for release in $(find . -name "InRelease"); do
+        echo "Processing: ${release}"
+        subdir=${release%/InRelease}
+        while read SHASUM SIZE NAME; do
+            if ! [ -f "${subdir}/${NAME}" ]; then
+               bname=$(basename ${NAME})
+                if [[ "${bname}" =~ ^(Packages|Sources|Translation-[a-zA-Z_]+)$ ]]; then
+                    # We don't keep unpacked files, don't check for their existance.
+                    # We might want to go and check their unpacked shasum, but right now
+                    # I don't care. I believe it should be enough if all the packed shasums
+                    # match.
+                    continue
+                fi
+                broken=$(( broken + 1 ))
+                echo "File ${subdir}/${NAME} is missing"
+                continue
+            fi
+
+           # We do have symlinks in the tree (see the contents files currently).
+           # So we use "readlink -f" to check the size of the target, as thats basically
+           # what gen-releases does
+            fsize=$(stat -c %s $(readlink -f "${subdir}/${NAME}"))
+            if [ ${fsize} -ne ${SIZE} ]; then
+                broken=$(( broken + 1 ))
+                echo "File ${subdir}/${NAME} has size ${fsize}, expected is ${SIZE}"
+                continue
+            fi
+
+            fshasum=$(sha1sum $(readlink -f "${subdir}/${NAME}"))
+            fshasum=${fshasum%% *}
+            if [ "${fshasum}" != "${SHASUM}" ]; then
+                broken=$(( broken + 1 ))
+                echo "File ${subdir}/${NAME} has checksum ${fshasum}, expected is ${SHASUM}"
+                continue
+            fi
+        done < <(sed '1,/SHA1:/d' "${release}" | sed '/SHA256:/,$d')
+    done
+
+    if [ $broken -gt 0 ]; then
+        log_error "Trouble with the public mirror, found ${broken} errors"
+        return 21
+    fi
+
     log "Starting the mirrorpush"
     date -u > /srv/ftp.debian.org/web/mirrorstart
     echo "Using dak v1" >> /srv/ftp.debian.org/web/mirrorstart
     log "Starting the mirrorpush"
     date -u > /srv/ftp.debian.org/web/mirrorstart
     echo "Using dak v1" >> /srv/ftp.debian.org/web/mirrorstart
@@ -465,11 +476,14 @@ function i18n2() {
     STAMP=$(date "+%Y%m%d%H%M")
     mkdir -p ${scriptdir}/i18n/${STAMP}
     cd ${scriptdir}/i18n/${STAMP}
     STAMP=$(date "+%Y%m%d%H%M")
     mkdir -p ${scriptdir}/i18n/${STAMP}
     cd ${scriptdir}/i18n/${STAMP}
-    dak control-suite -l stable > lenny
-    dak control-suite -l testing > squeeze
-    dak control-suite -l unstable > sid
+    for suite in stable testing unstable; do
+        codename=$(dak admin s show ${suite}|grep '^Codename')
+        codename=${codename##* }
+        echo "Codename is ${codename}"
+        dak control-suite -l ${suite} >${codename}
+    done
     echo "${STAMP}" > timestamp
     echo "${STAMP}" > timestamp
-    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
+    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 473041FA --detach-sign -o timestamp.gpg timestamp
     rm -f md5sum
     md5sum * > md5sum
     cd ${webdir}/
     rm -f md5sum
     md5sum * > md5sum
     cd ${webdir}/
@@ -494,22 +508,10 @@ function aptftpcleanup() {
     apt-ftparchive -q clean apt.conf
 }
 
     apt-ftparchive -q clean apt.conf
 }
 
-function compress() {
-    log "Compress old psql backups"
+function cleantransactions() {
+    log "Cleanup transaction ids older than 3 months"
     cd $base/backup/
     cd $base/backup/
-    find -maxdepth 1 -mindepth 1 -type f -name 'dump_pre_*' -mtime +2 -print0 | xargs -0 --no-run-if-empty rm
-
-    find -maxdepth 1 -mindepth 1 -type f -name 'dump_*' \! -name '*.bz2' \! -name '*.gz' -mmin +720 |
-    while read dumpname; do
-        echo "Compressing $dumpname"
-        bzip2 -9fv "$dumpname"
-    done
-    find -maxdepth 1 -mindepth 1 -type f -name "dumpall_*" \! -name '*.bz2' \! -name '*.gz' -mmin +720 |
-    while read dumpname; do
-        echo "Compressing $dumpname"
-        bzip2 -9fv "$dumpname"
-    done
-    finddup -l -d $base/backup
+    find -maxdepth 1 -mindepth 1 -type f -name 'txid_*' -mtime +90 -print0 | xargs -0 --no-run-if-empty rm
 }
 
 function logstats() {
 }
 
 function logstats() {
@@ -523,7 +525,7 @@ function savetimestamp() {
 }
 
 function maillogfile() {
 }
 
 function maillogfile() {
-    cat "$LOGFILE" | mail -s "Log for dinstall run of ${NOW}" cron@ftp-master.debian.org
+    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
 }
 
 function renamelogfile() {
 }
 
 function renamelogfile() {
@@ -554,13 +556,6 @@ function process_unchecked() {
     sync_debbugs
 }
 
     sync_debbugs
 }
 
-# do a run of newstage only before dinstall is on.
-function newstage() {
-    log "Processing the newstage queue"
-    UNCHECKED_WITHOUT_LOCK="-p"
-    do_newstage
-}
-
 # Function to update a "statefile" telling people what we are doing
 # (more or less).
 #
 # Function to update a "statefile" telling people what we are doing
 # (more or less).
 #
@@ -575,3 +570,46 @@ Current action: ${1}
 Action start: ${RIGHTNOW}
 EOF
 }
 Action start: ${RIGHTNOW}
 EOF
 }
+
+# extract changelogs and stuff
+function changelogs() {
+    log "Extracting changelogs"
+    dak make-changelog -e -a ftp-master
+    mkdir -p ${exportpublic}/changelogs
+    cd ${exportpublic}/changelogs
+    rsync -aHW --delete --delete-after --ignore-errors ${exportdir}/changelogs/. .
+    sudo -H -u archvsync /home/archvsync/runmirrors metaftpdo > ~dak/runmirrors-metadata.log 2>&1 &
+}
+
+function gitpdiff() {
+    # Might be that we want to change this to have more than one git repository.
+    # Advantage of one is that we do not need much space in terms of storage in git itself,
+    # git gc is pretty good on our input.
+    # But it might be faster. Well, lets test.
+    log "Adjusting the git tree for pdiffs"
+    cd ${dbdir}/git/git/
+
+    # The regex needs the architectures seperated with \|
+    garchs=$(dak admin a list|sed -e ':q;N;s/\n/\\|/g;t q')
+
+    # First, get all the files we want to work on. ../dists/ is a symlink to the real dists/ we
+    # want to work with.
+    # Also, we only want contents, packages and sources.
+    for file in $(find ../dists/ -regex ".*/\(Contents-\($archs\)\|\(Packages\|Sources\)\).gz"); do
+        log "${file}"
+        basen=${file%%.gz};
+        basen=${basen##../};
+        dir=${basen%/*};
+        mkdir -p $dir;
+        zcat $file > $basen;
+    done
+
+    # Second, add all there is into git
+    cd dists
+    git add .
+    # Maybe we want to make this the same for tag and commit? But well, shouldn't matter
+    COMD=$(date  -Is)
+    TAGD=$(date +%Y-%m-%d-%H-%M)
+    git commit -m "Commit of ${COMD}"
+    git tag "${TAGD}"
+ }