#!/bin/bash
-# initiate a mirror staged mirror update from sync-source.
+# initiate a staged mirror update from sync-source for a component.
#
# if we have a serial file and we got a serial on the command line, only sync if the serial is different
NAME="$(basename "$0")"
usage() {
- echo "Usage: $0 [--one-stage] <basedir> <sync-source> [<serial>]"
+ echo "Usage: $0 [--one-stage] <componentdir> <sync-source> [<serial>]"
}
if [ "${1:-}" = "-h" ] || [ "${1:-}" = "--help" ]; then usage; exit 0; fi
esac
done
-BASEDIR=${1:-}; shift
+COMPONENTDIR=${1:-}; shift
SYNC_SOURCE=${1:-}; shift
SYNC_SERIAL=${1:-}; shift || true
-if [ -z "$BASEDIR" ]; then usage >&2; exit 1; fi
+if [ -z "$COMPONENTDIR" ]; then usage >&2; exit 1; fi
if [ -z "$SYNC_SOURCE" ]; then usage >&2; exit 1; fi
RSYNC="rsync"
-RSYNC_BASE_OPTIONS="-avz --delete"
+RSYNC_BASE_OPTIONS="-rtvz --delete --links --hard-links --safe-links"
RSYNC_SSH_OPTIONS="ssh -o AddressFamily=inet -o BatchMode=yes"
LOGDIR="$HOME/logs"
! [ -e "$CNF_FILE" ] || . "$CNF_FILE"
SOURCE="${SYNC_SOURCE}/"
-BASEDIR="${BASEDIR}/"
+COMPONENTDIR="${COMPONENTDIR}/"
###############################################
}
lock() {
- exec 200< "$BASEDIR"
+ mkdir -p "$COMPONENTDIR"
+ exec 200< "$COMPONENTDIR"
if ! flock -e 200; then
log "Cannot acquire lock."
echo >&5 "[MSM] LOCK-ERROR"
log_setup
-#log "called with $* and ${SSH_ORIGINAL_COMMAND:-no ssh original command options}."
log "called with $*"
lock
-if [ -e "${BASEDIR}${ACTIVE}" ] && [ "$(readlink "${BASEDIR}${ACTIVE}")" = "$ALPHA" ] ; then
+if [ -e "${COMPONENTDIR}${ACTIVE}" ] && [ "$(readlink "${COMPONENTDIR}${ACTIVE}")" = "$ALPHA" ] ; then
staging="$BRAVO"
active="$ALPHA"
+elif [ -e "${COMPONENTDIR}${ACTIVE}" ] && [ "$(readlink "${COMPONENTDIR}${ACTIVE}")" != "$BRAVO" ] ; then
+ echo >&5 "Invalid state of ${COMPONENTDIR}${ACTIVE}."
+ exit 1
else
staging="$ALPHA"
active="$BRAVO"
log "active is $active; staging is $staging"
rsync_source="${SOURCE}"
-rsync_curactive="${BASEDIR}${active}/"
-rsync_target="${BASEDIR}${staging}/"
+rsync_curactive="${COMPONENTDIR}${active}/"
+rsync_target="${COMPONENTDIR}${staging}/"
if [ -e "$rsync_curactive/.serial" ] && [ -n "$SYNC_SERIAL" ] && [ "$(cat $rsync_curactive/.serial)" = "$SYNC_SERIAL" ]; then
log "active is already at serial $SYNC_SERIAL. No action required."
case "$action" in
go)
- ln --symbolic --force --no-target-directory "$staging" "${BASEDIR}$ACTIVE"
+ ln --symbolic --force --no-target-directory "$staging" "${COMPONENTDIR}$ACTIVE"
rm -rf "$rsync_curactive"
echo >&5 "[MSM] STAGE2-DONE"
log "stage2 done"