From 015f1540d65d9c2dcee44ddea7bc8f55d2db1858 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Mon, 5 Aug 2024 15:50:03 +0200 Subject: add mirrorsync script --- mirrorsync | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 mirrorsync (limited to 'mirrorsync') 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 +# +# 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" -- cgit