#!/bin/bash # mirror-status.sh # Generate a status page for FailZero mirrors MIRROR_BASE="/mnt/brimstone/mirror" STATUS_DIR="/mnt/brimstone/mirror/status" STATUS_FILE="$STATUS_DIR/index.html" LOG_DIR="/var/log/mirrors" # List your mirrors (folder name => display name) declare -A MIRRORS=( ["archlinux"]="Arch Linux" ["debian"]="Debian" ["gentoo"]="Gentoo" ["hardenedbsd"]="HardenedBSD" ["slackware"]="Slackware" ["void"]="Void Linux" ["rocky"]="Rocky Linux" ["alma"]="AlmaLinux" ) mkdir -p "$STATUS_DIR" cat > "$STATUS_FILE" < FailZero Mirror Status

FailZero Mirror Status

Updated: $(date)

EOF for key in "${!MIRRORS[@]}"; do DISTRO="${MIRRORS[$key]}" DIR="$MIRROR_BASE/$key" LOG="$LOG_DIR/${key}-mirror-sync.log" STATUS="FAIL" CLASS="fail" LASTSYNC="no log" FRESHNESS="unknown" # 1. Parse rsync log exitcode if [ -f "$LOG" ]; then LASTSYNC=$(stat -c %y "$LOG" | cut -d. -f1) EXITCODE=$(grep "EXITCODE:" "$LOG" | tail -n1 | cut -d: -f2) if [ -n "$EXITCODE" ]; then if [ "$EXITCODE" = "0" ]; then STATUS="OK" CLASS="ok" else STATUS="RSYNC FAIL ($EXITCODE)" CLASS="fail" fi else STATUS="NO EXITCODE" CLASS="warn" fi fi # 2. Check lastupdate if present (for freshness) # if [ -f "$DIR/lastupdate" ]; then # TS=$(tr -d '[:space:]' < "$DIR/lastupdate" 2>/dev/null) # if [[ "$TS" =~ ^[0-9]+$ ]]; then # NOW=$(date +%s) # AGE=$(( NOW - TS )) # if [ "$AGE" -lt 7200 ]; then # FRESHNESS="$((AGE/60)) min ago" # elif [ "$AGE" -lt 86400 ]; then # FRESHNESS="$((AGE/3600)) hr ago" # [ "$STATUS" = "OK" ] && CLASS="warn" # else # FRESHNESS="$((AGE/86400)) days ago" # [ "$STATUS" = "OK" ] && CLASS="warn" # fi # fi # fi echo " " >> "$STATUS_FILE" done cat >> "$STATUS_FILE" <

FailZero Infrastructure – Mirror Ops

EOF
DistroLast Sync (log)
$DISTRO$LASTSYNC