From 820452a93f68c05ac1083d56d9e560903d8ae1cf Mon Sep 17 00:00:00 2001 From: Francois Charette Date: Tue, 21 Jul 2009 11:38:09 +0200 Subject: Refactor ftpdir-cleanup to handle all arches This may look like a rather large patch, but the changes are mostly a reshuffling of the code to loop over all arches first, and then handle the arch-indep packages. The cronjob has been changed accordingly. Added new category DELETESYMLINKS, which are deleted instead of being moved to package-cleanup. I have also fixed the arch-specific issue with the ftppath, using parameters in config instead. Signed-off-by: Aaron Griffin --- config | 1 + cron-jobs/ftpdir-cleanup | 7 +- misc-scripts/ftpdir-cleanup | 267 +++++++++++++++++++++++++------------------- 3 files changed, 153 insertions(+), 122 deletions(-) diff --git a/config b/config index 425709a..16a71ce 100644 --- a/config +++ b/config @@ -1,5 +1,6 @@ FTP_BASE="/srv/ftp" +FTP_OS_SUFFIX="os" SVNREPO_core="file:///srv/svn-packages" SVNREPO_extra="file:///srv/svn-packages" diff --git a/cron-jobs/ftpdir-cleanup b/cron-jobs/ftpdir-cleanup index dfa968e..38c7fcd 100755 --- a/cron-jobs/ftpdir-cleanup +++ b/cron-jobs/ftpdir-cleanup @@ -1,13 +1,12 @@ #!/bin/bash repos="core extra testing community" -arches="i686 x86_64" LOCKFILE="/tmp/.ftpdircleanup.lock" cleanup () { rm -f "$LOCKFILE" - exit 0 + exit 0 } ctrl_c() { @@ -32,9 +31,7 @@ trap ctrl_c 2 . $(dirname $0)/../config for repo in $repos; do - for arch in $arches; do - $(dirname $0)/../misc-scripts/ftpdir-cleanup $repo $arch $CLEANUP_DESTDIR - done + $(dirname $0)/../misc-scripts/ftpdir-cleanup $repo $CLEANUP_DESTDIR done cleanup diff --git a/misc-scripts/ftpdir-cleanup b/misc-scripts/ftpdir-cleanup index e319b99..ee1dc2e 100755 --- a/misc-scripts/ftpdir-cleanup +++ b/misc-scripts/ftpdir-cleanup @@ -1,25 +1,22 @@ #!/bin/bash -if [ $# -ne 3 ]; then - echo "usage: $(basename $0) " +if [ $# -ne 2 ]; then + echo "usage: $(basename $0) " exit 1 fi reponame=$1 -arch=$2 -dest=$3 +dest=$2 -##### Arch specific stuff. TODO make this configurable ##### -ftppath_base="/srv/ftp/$reponame/os" ############################################################ -ftppath="$ftppath_base/$arch" - -if [ ! -d "$ftppath" ]; then - echo "FTP path '$ftppath' does not exist" +if [ ! -f "$(dirname $0)/../config" ]; then + echo "$(dirname $0)/../config not found! Aborting" exit 1 fi +. "$(dirname $0)/../config" + if [ ! -f /etc/makepkg.conf ]; then echo "/etc/makepkg.conf not found! Aborting" exit 1 @@ -28,140 +25,176 @@ fi . /etc/makepkg.conf getpkgname() { - local tmp - - tmp=${1##*/} - tmp=${tmp%$PKGEXT} - tmp=${tmp%-$arch} - echo ${tmp%-*-*} + local tmp + + tmp=${1##*/} + tmp=${tmp%$PKGEXT} + for arch in ${ARCHES[@]}; do + tmp=${tmp%-$arch} + done + tmp=${tmp%-any} + echo ${tmp%-*-*} } -getpkgname_ver() { - local tmp +TMPDIR=$(mktemp -d /tmp/cleanup-.XXXXXX) || exit 1 - tmp=${1##*/} - tmp=${tmp%$PKGEXT} - echo ${tmp%-$arch} -} +ftppath_base="$FTP_BASE/$reponame/$FTP_OS_SUFFIX" -MISSINGFILES="" -DELETEFILES="" -EXTRAFILES="" +for arch in ${ARCHES[@]}; do + + ftppath="$ftppath_base/$arch" + MISSINGFILES="" + DELETEFILES="" + DELETESYMLINKS="" + EXTRAFILES="" + + if [ ! -d "$ftppath" ]; then + echo "FTP path '$ftppath' does not exist" + exit 1 + fi -TMPDIR=$(mktemp -d /tmp/cleanup.XXXXXX) || exit 1 -cd "${TMPDIR}" -bsdtar xf "$ftppath/$reponame.db.tar.$DB_COMPRESSION" + cd "${TMPDIR}" + bsdtar xf "$ftppath/$reponame.db.tar.$DB_COMPRESSION" -for pkg in *; do - filename=$(grep -A1 '^%FILENAME%$' "${pkg}/desc" | tail -n1) - [ -z "${filename}" ] && filename="${pkg}${PKGEXT}" + for pkg in *; do + filename=$(grep -A1 '^%FILENAME%$' "${pkg}/desc" | tail -n1) + [ -z "${filename}" ] && filename="${pkg}${PKGEXT}" - if [ ! -e "${ftppath}/${filename}" ]; then - MISSINGFILES="${MISSINGFILES} ${filename}" - else - pkgname="$(getpkgname ${filename})" - for otherfile in ${ftppath}/${pkgname}-*; do - otherfile="$(basename ${otherfile})" - if [ "${otherfile}" != "${filename}" -a "${pkgname}" = "$(getpkgname ${otherfile})" ]; then - DELETEFILES="${DELETEFILES} ${otherfile}" + if [ ! -e "${ftppath}/${filename}" ]; then + MISSINGFILES="${MISSINGFILES} ${filename}" + else + pkgname="$(getpkgname ${filename})" + for otherfile in ${ftppath}/${pkgname}-*; do + otherfile="$(basename ${otherfile})" + if [ "${otherfile}" != "${filename}" -a "${pkgname}" = "$(getpkgname ${otherfile})" ]; then + if [ -h "${otherfile}" ]; then + DELETESYMLINKS="${DELETESYMLINKS} ${otherfile}" + else + DELETEFILES="${DELETEFILES} ${otherfile}" + fi + fi + done + fi + done + + cd "$ftppath" + for pkg in *$arch$PKGEXT; do + pkgname="$(getpkgname $pkg)" + for p in ${TMPDIR}/${pkgname}-*; do + if [ -d "${p}" -a "$(getpkgname $(basename ${p}))" = "${pkgname}" ]; then + continue 2 + fi + done + EXTRAFILES="$EXTRAFILES $pkg" + done + + cd "$ftppath" + rm -rf ${TMPDIR} + + # Do a quick check to see if a missing ARCHINDEPFILE is in the any dir + # If it is, and the file is MISSING, restore it + missfiles="$MISSINGFILES" + MISSINGFILES="" + for mf in $missfiles; do + af_satisfied=0 + if [ -e "${ftppath_base}/any/${mf}" ]; then + echo "Restoring missing 'any' symlink: ${mf}" + ln -s "../any/${mf}" "${ftppath}" + else + MISSINGFILES="${MISSINGFILES} ${mf}" fi - done + done + + echo "Scan complete for $reponame ($arch) at ${ftppath}" + + #Make sure we've done *something* before outputting anything + if [ -z "$DELETEFILES$DELETESYMLINKS$MISSINGFILES$EXTRAFILES" ]; then + continue + fi + + if [ -n "$DELETEFILES" ]; then + echo " The following files are out of date" + echo " They will be moved to '$dest'" + for f in $DELETEFILES; do + echo " $f" + done + echo "" + fi + + if [ -n "$DELETESYMLINKS" ]; then + echo " The following symlinks are out of date" + echo " They will be deleted" + for f in $DELETESYMLINKS; do + echo " $f" + done + echo "" + fi + + if [ -n "$MISSINGFILES" ]; then + echo " The following files are missing in the repo" + for f in $MISSINGFILES; do + echo " $f" + done + echo "" + fi + + if [ -n "$EXTRAFILES" ]; then + echo " The following files are in the repo but not the db" + echo " They will be moved to '$dest'" + for f in $EXTRAFILES; do + echo " $f" + done fi + + if [ -n "${DELETEFILES}" ]; then + mv ${DELETEFILES} "$dest" + echo "" + fi + + if [ -n "${DELETESYMLINKS}" ]; then + rm -f ${DELETESYMLINKS} + echo "" + fi + + if [ -n "${EXTRAFILES}" ]; then + mv ${EXTRAFILES} "$dest" + echo "" + fi + done -cd "$ftppath" -for pkg in *$arch$PKGEXT; do - pkgname="$(getpkgname $pkg)" - for p in ${TMPDIR}/${pkgname}-*; do - if [ -d "${p}" -a "$(getpkgname $(basename ${p}))" = "${pkgname}" ]; then - continue 2 - fi - done - EXTRAFILES="$EXTRAFILES $pkg" -done +ARCHINDEPFILES="" if [ -d "$ftppath_base/any" ]; then + echo "Checking arch-independent files..." cd "$ftppath_base/any" for pkg in *$PKGEXT; do [ -f "$pkg" ] || continue # in case we get a file named "*.pkg.tar.gz" + ### TODO loop over arch in ${ARCHES[@]} ... something like this: + # teststring="" + # for arch in ${ARCHES[@]}; do + # teststring="$teststring -a ! -h $ftppath_base/$arch/$pkg" + # done + # teststring=$(echo $teststring | sed 's/^ -a//') + # if [ eval "$teststring" ]; then if [ ! -h "$ftppath_base/i686/$pkg" -a ! -h "$ftppath_base/x86_64/$pkg" ]; then ARCHINDEPFILES="$ARCHINDEPFILES $pkg" fi done fi -cd "$ftppath" -rm -rf ${TMPDIR} - -#Make sure we've done *something* before outputting anything -if [ -z "$DELETEFILES$MISSINGFILES$EXTRAFILES$ARCHINDEPFILES" ]; then - exit 0 -fi - -# Do a quick check to see if a missing ARCHINDEPFILE is in the any dir -# If it is, and the file is MISSING, restore it -missfiles="$MISSINGFILES" -MISSINGFILES="" -for mf in $missfiles; do - af_satisfied=0 - if [ -e "${ftppath_base}/any/${mf}" ]; then - echo "Restoring missing 'any' symlink: ${mf}" - ln -s "../any/${mf}" "${ftppath}" - else - MISSINGFILES="${MISSINGFILES} ${mf}" - fi -done - -echo "Scan complete for $reponame ($arch) at ${ftppath}" - -if [ -n "$DELETEFILES" ]; then - echo " The following files are out of date" - echo " They will be moved to '$dest'" - for f in $DELETEFILES; do - echo " $f" - done - echo "" -fi - -if [ -n "$MISSINGFILES" ]; then - echo " The following files are missing in the repo" - for f in $MISSINGFILES; do - echo " $f" - done - echo "" -fi - -if [ -n "$EXTRAFILES" ]; then - echo " The following files are in the repo but not the db" - echo " They will be moved to '$dest'" - for f in $EXTRAFILES; do - echo " $f" - done -fi - if [ -n "$ARCHINDEPFILES" ]; then - echo " The following architecture independent packages" - echo " are not symlinked in the architecture repositories." - echo " They will be moved to '$dest'" + echo " The following architecture independent packages" + echo " are not symlinked in the architecture repositories." + echo " They will be moved to '$dest'" for f in $ARCHINDEPFILES; do echo " $f" done fi -if [ -n "${DELETEFILES}" ]; then - mv ${DELETEFILES} "$dest" - echo "" -fi - -if [ -n "${EXTRAFILES}" ]; then - mv ${EXTRAFILES} "$dest" - echo "" +if [ -d "$ftppath_base/any" -a -n "${ARCHINDEPFILES}" ]; then + cd "$ftppath_base/any" + mv ${ARCHINDEPFILES} "$dest" + echo "" fi - -cd "$ftppath_base/any" -if [ -n "${ARCHINDEPFILES}" ]; then - mv ${ARCHINDEPFILES} "$dest" - echo "" -fi - -- cgit v1.2.3-24-g4f1b