#!/bin/sh # do some basic sanity checks . "${0%/*}/../conf/default.conf" tmp_dir="$(mktemp -d)" trap 'rm -rf --one-file-system "${tmp_dir}"' EXIT if [ $# -eq 0 ]; then set -- repos package-database state-files fi while [ $# -gt 0 ]; do case "$1" in repos) >&2 printf 'sanity-check: checking repos on master mirror ...' repos='community-staging community-testing community core extra gnome-unstable kde-unstable staging testing' errors="$( ( printf '%s\n' ${repos} ls_master_mirror 'i686' ) | \ sort | \ uniq -u )" if [ -n "${errors}" ]; then echo echo "The following repos are missing or obsolete on the mirror:" echo "${errors}" exit 1 fi >&2 echo ' passed.' ;; package-database) for repo in ${repos}; do >&2 printf 'checking consistency of repository "%s" on the master mirror ...' "${repo}" packages="$( ls_master_mirror "i686/${repo}" | \ grep '\.pkg\.tar\.xz\(\.sig\)\?$' )" || true errors="$( echo "${packages}" | \ sed 's|\.sig$||' | \ uniq -c | \ grep -v '^\s*2\s' | \ awk '{print $2}' )" if [ -n "${errors}" ]; then echo echo "The following packages in ${repo} are missing a signature or vice versa:" echo "${errors}" exit 1 fi ${master_mirror_command} \ "${master_mirror_directory}/i686/${repo}/${repo}.db.tar.gz" \ "${master_mirror_directory}/i686/${repo}/${repo}.files.tar.gz" \ "${tmp_dir}/" errors="$( ( tar -tzf "${tmp_dir}/${repo}.db.tar.gz" | \ grep '/$' | \ sed 's|/$||' echo "${packages}" | \ sed 's|-[^-]\+$||' | \ sort -u ) | \ sort | \ uniq -u )" if [ -n "${errors}" ]; then echo echo "The following packages in ${repo} are missing from the database or vice versa:" echo "${errors}" exit 1 fi errors="$( ( tar -tzf "${tmp_dir}/${repo}.files.tar.gz" | \ grep '/$' | \ sed 's|/$||' echo "${packages}" | \ sed 's|-[^-]\+$||' | \ sort -u ) | \ sort | \ uniq -u )" if [ -n "${errors}" ]; then echo echo "The following packages in ${repo} are missing from the file-database or vice versa:" echo "${errors}" exit 1 fi rm -rf --one-file-system "${tmp_dir}/"* >&2 echo ' passed.' done ;; state-files) for status in 'staging:done' 'testing:testing'; do >&2 printf 'checking state-files of "%s" ...' "${status%:*}" errors="$( ( ls "${work_dir}/package-states" | \ grep "\.${status#*:}\$" | \ sed "s|^|${work_dir}/package-states/|" | \ xargs -r cat ls_master_mirror 'i686' | \ grep "${status%:*}\$" | \ while read -r repo; do ls_master_mirror "i686/${repo}" done | \ grep '\.pkg\.tar\.xz$' ) | \ sort | \ uniq -c | \ grep -v '^\s*2\s' | \ awk '{print $2}' )" if [ -n "${errors}" ]; then echo echo "The following ${status%:*} packages do not have state files or vice versa:" echo "${errors}" exit 1 fi >&2 echo ' passed.' done ;; *) >&2 printf 'sanity-check: unknown check "%s".' "$1" exit 2 ;; esac shift done