summaryrefslogtreecommitdiffstats
path: root/mirrorsync
diff options
context:
space:
mode:
Diffstat (limited to 'mirrorsync')
-rw-r--r--mirrorsync110
1 files changed, 110 insertions, 0 deletions
diff --git a/mirrorsync b/mirrorsync
new file mode 100644
index 0000000..cf80ab0
--- /dev/null
+++ b/mirrorsync
@@ -0,0 +1,110 @@
+#!/bin/env bash
+#
+# mirrorsync - Synchronize a Rocky mirror
+# By: Dennis Koerner <koerner@netzwerge.de>
+#
+# The latest version of this script can be found at:
+# https://github.com/rocky-linux/rocky-tools
+#
+# Please read https://docs.rockylinux.org/guides/mirror_management/add_mirror_manager/
+# for further information on setting up a Rocky mirror.
+#
+# Copyright (c) 2021 Rocky Enterprise Software Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice (including the next
+# paragraph) shall be included in all copies or substantial portions of the
+# Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+#
+
+# Find rsync in default path
+rsync_run(){
+ if command -v rsync >/dev/null; then
+ command rsync "$@";
+ else
+ command -p rsync "$@";
+ fi;
+}
+
+# You can change v to q if you do not want detailed logging
+# You may also add additional excludes if you don't want to provide certain
+# repositories or architectures.
+opts=(-avSH --exclude="*.~tmp~" --delete-delay --delay-updates)
+
+# Please use a mirror geographically close to you for initial sync,
+# or if you are hosting a private mirror (not publicly available).
+#
+# Note that local mirrors may be faster, and we might restrict
+# access to the master in the future.
+#
+# A complete list of mirrors can be found at
+# https://mirrors.rockylinux.org/mirrormanager/mirrors/Rocky
+src1="rsync://rpms.remirepo.net/enterprise/"
+src2="rsync://rpms.remirepo.net/fedora/"
+
+# Your local path. Change to whatever fits your system.
+# $mirrormodule is also used in syslog output.
+mirrormodule="Remi"
+dst1="/mnt/RepoSync/${mirrormodule}/enterprise"
+dst2="/mnt/RepoSync/${mirrormodule}/fedora"
+
+datefile="date"
+lockfile="$0.lockfile"
+logfile="$0.log"
+
+# Check if the datefile has changed on upstream mirror
+# and exit cleanly if it is still the same
+checkresult1=$(rsync_run --no-motd --dry-run --out-format="%n" "${src1}/${datefile}" "${dst1}/${datefile}")
+checkresult2=$(rsync_run --no-motd --dry-run --out-format="%n" "${src2}/${datefile}" "${dst2}/${datefile}")
+
+if [[ -z "$checkresult1" && -z "$checkresult2" ]]; then
+ printf "%s unchanged. Not updating at %(%c)T\n" "$datefile" -1 >> "$logfile" 2>&1
+ logger -t rsync "Not updating ${mirrormodule}: ${datefile} unchanged."
+ exit 0
+fi
+
+# Check for existing lockfile to avoid multiple simultaneously running syncs
+# If lockfile exists but process is dead continue anyway
+if [[ -e "$lockfile" ]] && ! kill -0 "$(< "$lockfile")" 2>/dev/null; then
+ printf "Warning: lockfile exists but process dead, continuing.\n" >> "$logfile" 2>&1
+ logger -t rsync "Warning: lockfile exists but process dead, continuing with updating ${mirrormodule}."
+ rm -f "$lockfile"
+elif [[ -e "$lockfile" ]]; then
+ printf "Update already in progress at %(%c)T\n" -1 >> "$logfile" 2>&1
+ logger -t rsync "Not updating ${mirrormodule}: already in progress."
+ exit 1
+fi
+
+# The actual syncing part
+printf '%s\n' "$$" > "$lockfile"
+printf "Started update at %(%c)T\n" -1 >> "$logfile" 2>&1
+logger -t rsync "Updating ${mirrormodule}"
+wget https://rpms.remirepo.net/index.html -O /mnt/RepoSync/${mirrormodule}/index.html
+
+# Sync src1/dst1 if there are changes
+if [[ -n "$checkresult1" ]]; then
+ rsync_run "${opts[@]}" "${src1}/" "${dst1}/" >> "$logfile" 2>&1
+fi
+
+# Sync src2/dst2 if there are changes
+if [[ -n "$checkresult2" ]]; then
+ rsync_run "${opts[@]}" "${src2}/" "${dst2}/" >> "$logfile" 2>&1
+fi
+
+logger -t rsync "Finished updating ${mirrormodule}"
+printf "End: %(%c)T\n" -1 >> "$logfile" 2>&1
+rm -f "$lockfile"