summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPierre Schmitz <pierre@archlinux.de>2010-08-08 15:03:27 +0200
committerPierre Schmitz <pierre@archlinux.de>2010-08-08 15:03:27 +0200
commit9eb1cd7b9403533c4b60ecfbbbf00a08c211059a (patch)
tree024459abc4017b4c574bf6e5cd9d2f4df2b95f26
parent388d629327d97e8d15a7a67cc87ae36edfe2f385 (diff)
downloaddbscripts-9eb1cd7b9403533c4b60ecfbbbf00a08c211059a.tar.gz
dbscripts-9eb1cd7b9403533c4b60ecfbbbf00a08c211059a.tar.xz
Move common function to db-functions
db-functions now sets an individual $WORKDIR and implements trap functinos that remove locks on exit or error. There are new functions to lock and unlock the running script. misc-scripts/ftpdir-cleanup was renamed to ftpdir-cleanup-repo as the cron-job had the same name. Script names have to be unique when using db-functions.
-rwxr-xr-xcron-jobs/ftpdir-cleanup26
-rw-r--r--db-functions74
-rwxr-xr-xdb-move25
-rwxr-xr-xdb-remove23
-rwxr-xr-xdb-update22
-rwxr-xr-xmisc-scripts/ftpdir-cleanup-repo (renamed from misc-scripts/ftpdir-cleanup)13
-rwxr-xr-xmisc-scripts/make-sourceball21
-rwxr-xr-xmisc-scripts/sourceballs-cleanup27
-rw-r--r--test/lib/common.inc6
-rwxr-xr-xtesting2x16
10 files changed, 85 insertions, 168 deletions
diff --git a/cron-jobs/ftpdir-cleanup b/cron-jobs/ftpdir-cleanup
index 546afd9..f5e401a 100755
--- a/cron-jobs/ftpdir-cleanup
+++ b/cron-jobs/ftpdir-cleanup
@@ -5,34 +5,14 @@
repos="$(get_repos_for_host)"
-LOCKFILE="/tmp/.ftpdircleanup.lock"
-
-cleanup () {
- rm -f "$LOCKFILE"
- exit 0
-}
-
-ctrl_c() {
- cleanup
-}
-
-if [ -f "$LOCKFILE" ]; then
- owner="$(/usr/bin/stat -c %U $LOCKFILE)"
- echo "error: ftp cleanup is already in progress (started by $owner)"
- exit 1
-fi
-
-trap cleanup 0
-trap ctrl_c 2
-
-/bin/touch "$LOCKFILE"
+script_lock
#adjust the nice level to run at a lower priority
/usr/bin/renice +10 -p $$ > /dev/null
repopaths=''
for repo in $repos; do
- $(dirname $0)/../misc-scripts/ftpdir-cleanup $repo
+ $(dirname $0)/../misc-scripts/ftpdir-cleanup-repo $repo
repopaths="${repopaths} ${FTP_BASE}/${repo}/os/"
done
@@ -60,4 +40,4 @@ if [ -n "$to_cleanup" ]; then
mv $to_cleanup "$CLEANUP_DESTDIR"
fi
-cleanup
+script_unlock
diff --git a/db-functions b/db-functions
index caaf9a0..36ffb07 100644
--- a/db-functions
+++ b/db-functions
@@ -1,10 +1,6 @@
#!/bin/bash
-# set up general environment
-WORKDIR=$(mktemp -d /tmp/$(basename $0).XXXXXXXXXX)
-
# Useful functions
-
UMASK=""
set_umask () {
[ "$UMASK" == "" ] && UMASK="$(umask)"
@@ -16,8 +12,73 @@ restore_umask () {
umask $UMASK >/dev/null
}
+# set up general environment
+WORKDIR=$(mktemp -d /tmp/$(basename $0).XXXXXXXXXX)
+LOCKS=()
+
+script_lock() {
+ local LOCKDIR="$TMPDIR/.scriptlock.$(basename $0)"
+ if ! mkdir "$LOCKDIR" >/dev/null 2>&1 ; then
+ local _owner="$(/usr/bin/stat -c %U $LOCKDIR)"
+ echo "Error: Script $(basename $0) is already locked by $_owner." >&2
+ exit 1
+ else
+ set_umask
+ return 0
+ fi
+}
+
+script_unlock() {
+ local LOCKDIR="$TMPDIR/.scriptlock.$(basename $0)"
+ if [ ! -d "$LOCKDIR" ]; then
+ echo "Warning: Script $(basename $0) was not locked!" >&2
+ restore_umask
+ return 1
+ else
+ rmdir "$LOCKDIR"
+ restore_umask
+ return 0
+ fi
+}
+
+cleanup() {
+ local l
+ local repo
+ local arch
+
+ trap - EXIT INT QUIT TERM
+ for l in ${LOCKS[@]}; do
+ repo=${l%.*}
+ arch=${l#*.}
+ if [ -d "$TMPDIR/.repolock.$repo.$arch" ]; then
+ echo "Removing left over lock from $repo/$arch" >&2
+ repo_unlock $repo $_arch
+ fi
+ done
+ if [ -d "$TMPDIR/.scriptlock.$(basename $0)" ]; then
+ echo "Removing left over lock from $(basename $0)" >&2
+ script_unlock
+ fi
+ rm -rf "$WORKDIR"
+ [ "$1" ] && exit $1
+}
+
+abort() {
+ echo 'Aborting...' >&2
+ cleanup 0
+}
+
+die() {
+ echo "$*" >&2
+ cleanup 1
+}
+
+trap abort INT QUIT TERM
+trap cleanup EXIT
+
+
repo_lock () { #repo_lock <repo-name> <arch> [timeout]
- LOCKDIR="$TMPDIR/.repolock.$1.$2"
+ local LOCKDIR="$TMPDIR/.repolock.$1.$2"
local _count
local _trial
local _timeout
@@ -39,6 +100,7 @@ repo_lock () { #repo_lock <repo-name> <arch> [timeout]
_owner="$(/usr/bin/stat -c %U $LOCKDIR)"
echo "warning: Repo $1-$2 is already locked by $_owner. Retrying in $LOCK_DELAY seconds..." >&2
else
+ LOCKS[${#LOCKS[*]}]="$1.$2"
set_umask
return 0
fi
@@ -51,7 +113,7 @@ repo_lock () { #repo_lock <repo-name> <arch> [timeout]
}
repo_unlock () { #repo_unlock <repo-name> <arch>
- LOCKDIR="$TMPDIR/.repolock.$1.$2"
+ local LOCKDIR="$TMPDIR/.repolock.$1.$2"
if [ ! -d "$LOCKDIR" ]; then
echo "warning: Repo lock $1-$2 was not locked!" >&2
restore_umask
diff --git a/db-move b/db-move
index 8b15831..b846e79 100755
--- a/db-move
+++ b/db-move
@@ -23,28 +23,6 @@ ftppath_to="$FTP_BASE/$repoto/os/"
svnrepo_from="$repofrom-$_arch"
svnrepo_to="$repoto-$_arch"
-cleanup() {
- trap '' 0 2
- # unlock
- repo_unlock $repoto $_arch
- repo_unlock $repofrom $_arch
- rm -rf "$WORKDIR"
- [ "$1" ] && exit $1
-}
-
-ctrl_c() {
- echo "Interrupted" >&2
- cleanup 0
-}
-
-die() {
- echo "$*" >&2
- cleanup 1
-}
-
-trap ctrl_c 2
-trap cleanup 0
-
repo_lock $repoto $_arch || exit 1
repo_lock $repofrom $_arch || exit 1
@@ -91,3 +69,6 @@ if [ -d "$packagebase/repos/$svnrepo_from" ]; then
else
die "Error: $packagebase is not in repo $repofrom"
fi
+
+repo_unlock $repoto $_arch || exit 1
+repo_unlock $repofrom $_arch || exit 1
diff --git a/db-remove b/db-remove
index 0da9e75..5d61c97 100755
--- a/db-remove
+++ b/db-remove
@@ -15,27 +15,6 @@ _arch="$3"
ftppath="$FTP_BASE/$reponame/os"
svnrepo="$reponame-$_arch"
-cleanup() {
- trap '' 0 2
- # unlock
- repo_unlock $reponame $_arch
- rm -rf "$WORKDIR"
- [ "$1" ] && exit $1
-}
-
-ctrl_c() {
- echo "Interrupted" >&2
- cleanup 0
-}
-
-die() {
- echo "$*" >&2
- cleanup 1
-}
-
-trap ctrl_c 2
-trap cleanup 0
-
repo_lock $reponame $_arch || exit 1
echo -n "Removing $packagebase from $reponame..."
@@ -71,4 +50,6 @@ done
echo 'done'
+repo_unlock $reponame $_arch || exit 1
+
# vim: set ts=4 sw=4 noet ft=sh:
diff --git a/db-update b/db-update
index e53aee8..f971a6f 100755
--- a/db-update
+++ b/db-update
@@ -33,26 +33,6 @@ if [ ! -d $stagedir ]; then
exit 1
fi
-cleanup() {
- trap '' 0 2
- repo_unlock $reponame $current_arch
- rm -rf "$WORKDIR"
- [ "$1" ] && exit $1
-}
-
-ctrl_c() {
- echo "Interrupted" >&2
- cleanup 1
-}
-
-die() {
- echo "$*" >&2
- cleanup 1
-}
-
-trap ctrl_c 2
-trap cleanup 0
-
echo -n "Updating $reponame..."
# Remove any package from $stagedir that is already in the FTP repository
@@ -238,6 +218,4 @@ fi
echo 'done'
-trap '' 0 2
-rm -rf $WORKDIR
# vim: set ts=4 sw=4 noet ft=sh:
diff --git a/misc-scripts/ftpdir-cleanup b/misc-scripts/ftpdir-cleanup-repo
index ac17a8d..12f726c 100755
--- a/misc-scripts/ftpdir-cleanup
+++ b/misc-scripts/ftpdir-cleanup-repo
@@ -12,14 +12,6 @@ reponame=$1
. "$(dirname $0)/../db-functions"
. "$(dirname $0)/../config"
-cleanup() {
- trap '' 2 15
- for arch in ${ARCHES[@]}; do
- repo_unlock $reponame $arch
- done
- exit 1
-}
-
clean_pkgs () {
for pkg in "$@"; do
if [ -h "$pkg" ]; then
@@ -30,9 +22,6 @@ clean_pkgs () {
done
}
-trap cleanup 2
-trap cleanup 15
-
${CLEANUP_DRYRUN} && echo 'dry run mode is active'
ftppath_base="$FTP_BASE/$reponame/os"
@@ -41,7 +30,7 @@ for arch in ${ARCHES[@]}; do
repo_lock $reponame $arch $LOCK_TIMEOUT || continue
- CLEANUP_TMPDIR=$(mktemp -d ${TMPDIR}/cleanup-XXXXXX) || exit 1
+ CLEANUP_TMPDIR=$(mktemp -d ${WORKDIR}/cleanup-XXXXXX) || exit 1
ftppath="$ftppath_base/$arch"
MISSINGFILES=""
DELETEFILES=""
diff --git a/misc-scripts/make-sourceball b/misc-scripts/make-sourceball
index e216356..6e57385 100755
--- a/misc-scripts/make-sourceball
+++ b/misc-scripts/make-sourceball
@@ -22,21 +22,7 @@ _arch="$3"
srcpath="$FTP_BASE/sources/"
logpath="/var/log/sourceballs/"
-cleanup() {
- restore_umask
- rm -rf "$WORKDIR"
- [ "$1" ] && exit $1
-}
-
-ctrl_c() {
- echo "Interrupted" >&2
- cleanup 0
-}
-
-die() {
- echo -e "$*" >&2
- cleanup 1
-}
+script_lock
create_srcpackage() {
if [ -d "$1" ]; then
@@ -71,9 +57,6 @@ create_srcpackage() {
fi
}
-trap ctrl_c 2
-trap cleanup 0 1
-
set_umask
/bin/mkdir -p "$logpath"
cd "$WORKDIR"
@@ -91,3 +74,5 @@ else
die "\tPackage '$packagename' does not exist in repo '$reponame-$_arch'"
fi
fi
+
+script_unlock
diff --git a/misc-scripts/sourceballs-cleanup b/misc-scripts/sourceballs-cleanup
index c87a888..e058c38 100755
--- a/misc-scripts/sourceballs-cleanup
+++ b/misc-scripts/sourceballs-cleanup
@@ -6,19 +6,7 @@
srcpath="$FTP_BASE/sources/"
logfile="$srcpath/cleanup.txt"
-LOCKFILE="/tmp/.sourceball-cleanup.lock"
-
-cleanup () {
- restore_umask
- rm -rf "$WORKDIR"
- rm -f "$LOCKFILE"
- exit 0
-}
-
-ctrl_c() {
- echo "Interrupted" >&2
- cleanup 0
-}
+script_lock
remove_old() {
if [ -d "$1" ]; then
@@ -52,17 +40,6 @@ remove_old() {
fi
}
-if [ -f "$LOCKFILE" ]; then
- owner="$(/usr/bin/stat -c %U $LOCKFILE)"
- echo "error: source tarball generation is already in progress (started by $owner)"
- exit 1
-fi
-
-trap cleanup 0
-trap ctrl_c 2
-
-/bin/touch "$LOCKFILE"
-
#adjust the nice level to run at a lower priority
/usr/bin/renice +10 -p $$ > /dev/null
@@ -91,4 +68,4 @@ for sourceball in "$srcpath"/*$SRCEXT; do
fi
done
-cleanup 0
+script_unlock
diff --git a/test/lib/common.inc b/test/lib/common.inc
index d28017d..ba5be9f 100644
--- a/test/lib/common.inc
+++ b/test/lib/common.inc
@@ -7,8 +7,8 @@ oneTimeSetUp() {
echo -n 'Building packages...'
for p in "${pkgdir}"/*; do
pushd $p >/dev/null
- linux32 makepkg -cf --config ${curdir}/lib/makepkg-i686.conf >/dev/null 2>&1 || exit 1
- [ -f *-any.pkg.tar.* ] || linux64 makepkg -cf --config ${curdir}/lib/makepkg-x86_64.conf >/dev/null 2>&1 || exit 1
+ linux32 makepkg -cf --config ${curdir}/lib/makepkg-i686.conf >/dev/null 2>&1 || die 'makepkg failed'
+ [ -f *-any.pkg.tar.* ] || linux64 makepkg -cf --config ${curdir}/lib/makepkg-x86_64.conf >/dev/null 2>&1 || die 'makepkg failed'
popd >/dev/null
done
echo 'done'
@@ -23,7 +23,7 @@ setUp() {
local p
local pkg
- [ -f "${curdir}/../config.local" ] && exit 1
+ [ -f "${curdir}/../config.local" ] && die "${curdir}/../config.local exists"
TMP="$(mktemp -d /dev/shm/$(basename $0).XXXXXXXXXX)"
#echo "Using ${TMP}"
diff --git a/testing2x b/testing2x
index e9fbeaa..bf48be6 100755
--- a/testing2x
+++ b/testing2x
@@ -12,20 +12,6 @@ case "$0" in
;;
esac
-cleanup() {
- trap '' 0 2
- rm -rf "${WORKDIR}"
- [ -n "$1" ] && exit $1
-}
-
-ctrl_c() {
- echo "Interrupted" >&2
- cleanup 0
-}
-
-trap ctrl_c 2
-trap cleanup 0
-
cd "${WORKDIR}"
/usr/bin/svn checkout -N $SVNREPO checkout
cd checkout
@@ -49,5 +35,3 @@ for pkg in $*; do
echo "===> Warning: ${pkg} is not in testing-${_arch}"
fi
done
-
-cleanup