mirror: Refactoring sync-mirrors script

This commit is contained in:
Timo Makinen 2024-12-06 10:10:46 +00:00
parent 205b82f1d8
commit 770d6a74d3
2 changed files with 46 additions and 49 deletions

View file

@ -1,4 +1,7 @@
#!/bin/bash #!/bin/sh
set -eu
umask 022
LOCKFILE="/var/run/sync-mirrors/lockfile" LOCKFILE="/var/run/sync-mirrors/lockfile"
LOGFILE="/var/log/sync-mirrors/sync-mirrors-$(date +%Y%m%d%H%M%S).log" LOGFILE="/var/log/sync-mirrors/sync-mirrors-$(date +%Y%m%d%H%M%S).log"
@ -9,30 +12,35 @@ usage() {
echo " $(basename "$0") -l" 1>&2 echo " $(basename "$0") -l" 1>&2
} }
logmsg() { list_mirrors() {
[ "${VERBOSE}" -eq 1 ] && echo "$1" for f in "$CONFDIR"/*.conf ; do
echo "$(date '+%Y/%m/%d %H:%M:%S') [$$] $1" >> "${LOGFILE}" basename "$f" ".conf"
done
} }
if [ -d ${CONFDIR} ]; then logmsg() {
MIRRORLIST="$(find ${CONFDIR}/ -name \*.conf | while read -r f ; \ "$VERBOSE" && echo "$1"
do basename "${f}" | sed -e 's/\.conf$//' ; done)" echo "$(date '+%Y/%m/%d %H:%M:%S') [$$] $1" >> "$LOGFILE"
if [ "${MIRRORLIST}" = "" ]; then }
echo "ERR: No configured mirrors found" 1>&2
exit 1 logstream() {
fi while read -r line; do
else logmsg "$line"
done
}
if [ ! -d "$CONFDIR" ]; then
echo "ERR: Config directory [${CONFDIR}] missing" 1>&2 echo "ERR: Config directory [${CONFDIR}] missing" 1>&2
exit 1 exit 1
fi fi
VERBOSE=0 VERBOSE=false
NOOP="" NOOP=""
EXTRA_OPTS="" EXTRA_OPTS=""
while getopts "vhln" c ; do while getopts "vhln" c ; do
case $c in case $c in
v) v)
VERBOSE=1 VERBOSE=true
EXTRA_OPTS="${EXTRA_OPTS} -v --progress" EXTRA_OPTS="${EXTRA_OPTS} -v --progress"
;; ;;
h) h)
@ -41,9 +49,7 @@ while getopts "vhln" c ; do
;; ;;
l) l)
echo "Available mirrors:" echo "Available mirrors:"
for name in ${MIRRORLIST} ; do list_mirrors | sed -e 's/^/ /'
echo " ${name}"
done
exit 0 exit 0
;; ;;
n) n)
@ -59,17 +65,19 @@ done
shift "$((OPTIND - 1))" shift "$((OPTIND - 1))"
if [ $# -gt 0 ]; then if [ $# -eq 0 ]; then
set -- $(list_mirrors)
if [ $# -eq 0 ]; then
echo "ERR: No configured mirrors found" 1>&2
exit 1
fi
else
for mirror in "$@" ; do for mirror in "$@" ; do
if [ ! -f "${CONFDIR}/$1.conf" ]; then if [ ! -f "${CONFDIR}/$1.conf" ]; then
echo "ERR: No mirror named [$1]" 1>&2 echo "ERR: No mirror named [$1]" 1>&2
exit 1 exit 1
fi fi
SYNC="${MIRRORS} $1"
shift
done done
else
SYNC="${MIRRORLIST}"
fi fi
if [ "$(whoami)" != "mirror" ]; then if [ "$(whoami)" != "mirror" ]; then
@ -77,52 +85,41 @@ if [ "$(whoami)" != "mirror" ]; then
exit 1 exit 1
fi fi
umask 022 if [ -f "$LOCKFILE" ]; then
if kill -0 "$(cat $LOCKFILE)" ; then
if [ -f "${LOCKFILE}" ]; then STARTED=" ($(stat --format='%y' $LOCKFILE))"
if kill -0 "$(cat ${LOCKFILE})" ; then
STARTED=" ($(stat --format='%y' ${LOCKFILE}))"
echo "ERR: Lockfile exists${STARTED}, exiting" 1>&2 echo "ERR: Lockfile exists${STARTED}, exiting" 1>&2
exit 1 exit 1
else else
echo "WARN: Removing stale lock file..." 1>&2 echo "WARN: Removing stale lock file..." 1>&2
rm -f "${LOCKFILE}" rm -f "$LOCKFILE"
fi fi
fi fi
trap 'rm -f ${LOCKFILE}' INT TERM EXIT trap 'rm -f $LOCKFILE' INT TERM EXIT
echo "$$" > "${LOCKFILE}" echo "$$" > "$LOCKFILE"
for mirror in ${SYNC} ; do for mirror in "$@" ; do
POSTCMD="" POSTCMD=""
SRC="" SRC=""
RSYNCOPTS="" RSYNCOPTS=""
# shellcheck source=/dev/null
. "${CONFDIR}/${mirror}.conf" . "${CONFDIR}/${mirror}.conf"
if [ "${SRC}" = "" ]; then if [ "$SRC" = "" ]; then
echo "ERR: No SRC set for mirror ${mirror} ..." 1>&2 echo "ERR: No SRC set for mirror ${mirror} ..." 1>&2
exit 1 exit 1
fi fi
logmsg "Starting ${mirror} sync${NOOP}..." logmsg "Starting ${mirror} sync${NOOP}..."
rsync -aH -4 ${EXTRA_OPTS} --numeric-ids --delete --delete-delay \ rsync -aH -4 $EXTRA_OPTS --numeric-ids --delete --delete-delay \
--delay-updates --no-motd ${RSYNCOPTS} --log-file="${LOGFILE}" \ --delay-updates --no-motd $RSYNCOPTS --log-file="$LOGFILE" \
--exclude=.~tmp~/ "${SRC}" "/srv/mirrors/${mirror}/" --exclude=.~tmp~/ "$SRC" "/srv/mirrors/${mirror}/"
STATUS=$? STATUS=$?
if [ ${STATUS} -ne 0 ]; then if [ $STATUS -ne 0 ]; then
echo "WARN: Encountered errors on ${mirror} sync, see ${LOGFILE} for details" 1>&2 echo "WARN: Encountered errors on ${mirror} sync, see ${LOGFILE} for details" 1>&2
fi fi
logmsg "Finished ${mirror} sync with exit status ${STATUS}${NOOP} ..." logmsg "Finished ${mirror} sync with exit status ${STATUS}${NOOP} ..."
if [ "${POSTCMD}" != "" ]; then if [ "$POSTCMD" != "" ]; then
logmsg "Running post for ${mirror} ..." logmsg "Running post for ${mirror} ..."
if [ "${VERBOSE}" -eq 1 ]; then $POSTCMD 2>&1 | logstream
${POSTCMD} 2>&1 | tee >( \
awk "{ print strftime(\"%Y/%m/%d %H:%M:%S\") \" [$$] \" \$0 }" \
>> "${LOGFILE}" )
else
${POSTCMD} 2>&1 | \
awk "{ print strftime(\"%Y/%m/%d %H:%M:%S\") \" [$$] \" \$0 }" \
>> "${LOGFILE}"
fi
logmsg "Finished post for ${mirror} ..." logmsg "Finished post for ${mirror} ..."
fi fi
done done
rm -f "${LOCKFILE}"

View file

@ -70,7 +70,7 @@
- name: Copy mirroring script - name: Copy mirroring script
ansible.builtin.copy: ansible.builtin.copy:
dest: /usr/local/bin/sync-mirrors dest: /usr/local/bin/sync-mirrors
src: sync-mirrors src: sync-mirrors.sh
mode: "0755" mode: "0755"
owner: root owner: root
group: root group: root