aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndré Erdmann <dywi@mailerd.de>2013-07-18 21:19:55 +0200
committerAndré Erdmann <dywi@mailerd.de>2013-07-18 21:19:55 +0200
commitf37d415d9c84ecd37a0b7ccf02e37d5106dcf486 (patch)
tree829afab7cb20ce1ca6ebf415a86960756597f194
parentremove --run-script from roverlay, add roverlay-sh (diff)
downloadR_overlay-f37d415d9c84ecd37a0b7ccf02e37d5106dcf486.tar.gz
R_overlay-f37d415d9c84ecd37a0b7ccf02e37d5106dcf486.tar.bz2
R_overlay-f37d415d9c84ecd37a0b7ccf02e37d5106dcf486.zip
files/scripts: run-roverlay.sh
Safely run overlay creation (abort if another process is already running). This can be used to set up a cron job.
-rwxr-xr-xfiles/scripts/run-roverlay.sh93
1 files changed, 93 insertions, 0 deletions
diff --git a/files/scripts/run-roverlay.sh b/files/scripts/run-roverlay.sh
new file mode 100755
index 0000000..0ce26b4
--- /dev/null
+++ b/files/scripts/run-roverlay.sh
@@ -0,0 +1,93 @@
+#!/usr/bin/roverlay-sh
+#
+# This script runs R overlay creation and repoman afterwards.
+#
+# It will exit immediately if another instance is already running.
+# To achieve this, filesystem locks are used (/run/lock/roverlay.lock).
+#
+# So, it's safe to set up a cronjob that calls this script.
+#
+set -u
+
+# reset DEBUG, VERBOSE, QUIET
+DEBUG=n; QUIET=n; VERBOSE=y
+
+LC_COLLATE=C
+
+. "${FUNCTIONS?}" || exit 9
+
+readonly MY_LOCK=/run/lock/roverlay
+MY_LOCK_PID=
+
+# void run__cleanup ( **MY_LOCK_PID!, **MY_LOCK )
+#
+# Atexit function that releases the lock.
+#
+run__cleanup() {
+ # release trap
+ trap - INT TERM EXIT
+
+ # release lock
+ if [ -n "${MY_LOCK_PID-}" ]; then
+ kill "${MY_LOCK_PID}"
+ wait "${MY_LOCK_PID}" 2>>${DEVNULL} && MY_LOCK_PID=
+ fi
+ lockfile-remove "${MY_LOCK}" || true
+}
+
+
+# prepare:
+
+# (TODO)
+REPOMAN_ARGS="--pretend full"
+
+WANT_ROVERLAY_CREATE=y
+WANT_ROVERLAY_SYNC=y
+WANT_REPOMAN=y
+
+# parse args
+doshift=1
+while [ $# -gt 0 ]; do
+ case "${1?}" in
+ '+C'|'--no-create') WANT_ROVERLAY_CREATE=n ;;
+ '+S'|'--no-sync') WANT_ROVERLAY_SYNC=n ;;
+ '+R'|'--no-repoman') WANT_REPOMAN=n ;;
+ *)
+ die "unknown arg: ${1}" ${EX_ARG_ERR?}
+ ;;
+ esac
+ shift ${doshift} || OUT_OF_BOUNDS
+ doshift=1
+done
+unset -v doshift
+
+# anything to do?
+
+# main:
+#
+# anything to do? acquire lock
+if ! list_has y \
+ "${WANT_ROVERLAY_CREATE}" "${WANT_ROVERLAY_SYNC}" "${WANT_REPOMAN}"
+then
+ die 'nothing to do' 2
+elif lockfile-create --retry 0 "${MY_LOCK}" 2>>${DEVNULL}; then
+ # hold lock until done
+ lockfile-touch "${MY_LOCK}" &
+ MY_LOCK_PID="$!"
+ trap run__cleanup INT TERM EXIT
+
+ roverlay_opts=""
+ roverlay_opts() { roverlay_opts="${roverlay_opts-}${roverlay_opts:+ }$*"; }
+
+ ! yesno "${WANT_ROVERLAY_SYNC}" || roverlay_opts "--nosync"
+
+ # run roverlay
+ if ${ROVERLAY_EXE} ${roverlay_opts}; then
+ # success, continue with repoman
+ if yesno "${WANT_REPOMAN}"; then
+ ( cd "${S}" && repoman ${REPOMAN_ARGS} 2>&1 1>"${WORKDIR}/repoman.log"; )
+ fi
+ fi
+else
+ die "another instance is already running" 0
+fi