From 2640e74b87e1f8dd818539e6a7a2ac4a43797dd5 Mon Sep 17 00:00:00 2001 From: FailedProxy Date: Fri, 27 Mar 2026 19:12:28 +0000 Subject: [PATCH] reverted back --- Rsync/rsync.sh | 193 ++++++++++++++++++++++++++++++------------------- 1 file changed, 120 insertions(+), 73 deletions(-) diff --git a/Rsync/rsync.sh b/Rsync/rsync.sh index 10777eb..50201ad 100644 --- a/Rsync/rsync.sh +++ b/Rsync/rsync.sh @@ -1,104 +1,151 @@ #!/bin/bash set -e - # ---------------------------------------------------------------------------------------------- # --------------------------------- Rsync Core Script ------------------------------------------ # ---------------------------------------------------------------------------------------------- -# User Variables handled in Master.conf +# ---------------- User Variables, Please adjust in Master.conf as needed ---------------------- +# ---------------------------------------------------------------------------------------------- +# +# User variables can be adjusted in Master.conf +# +# Scripts now just contain runtime logic +# +# This new setup allows for profiles and arguments to use the core script +# +# Use arguments in unRAID User Plugin for directory +# Example = /mnt/user/appdata/unraid_scripts/Rsync/rsync.sh --dry-run +# ---------------------------------------------------------------------------------------------- +# -------------- End Of User Variables, Please adjust in Master.conf as needed ----------------- # ---------------------------------------------------------------------------------------------- -# Resolve script directory (Unraid-safe /tmp compatible) -PROJECT_ROOT="/mnt/user/appdata/unraid_scripts" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -SCRIPT_DIR="$PROJECT_ROOT/Rsync" +source "$SCRIPT_DIR/../Master.conf" +source "$SCRIPT_DIR/../common.sh" -# ---------------------------------------------------------------------------------------------- -# Load configs & helpers (FIXED PATHS) -# ---------------------------------------------------------------------------------------------- -source "$PROJECT_ROOT/Master.conf" -source "$PROJECT_ROOT/common.sh" +# ----------------------------- ARG PARSING FIX ----------------------------- +DIRECTORY="" +RAW_ARGS=() -# ---------------------------------------------------------------------------------------------- -# Init -# ---------------------------------------------------------------------------------------------- -log_info "Sync script initialized" +for ARG in "$@"; do + case "$ARG" in + --*|*=*) + RAW_ARGS+=("$ARG") + ;; + *) + [[ -z "$DIRECTORY" ]] && DIRECTORY="$ARG" || RAW_ARGS+=("$ARG") + ;; + esac +done -LOCAL_HOST="$(hostname)" -REMOTE_HOST="${REMOTE_HOST:-jayred365}" +parse_args "${RAW_ARGS[@]}" -log_info "Host: ${LOCAL_HOST} → ${REMOTE_HOST}" +[[ -z "$DIRECTORY" ]] && error "Missing directory" && exit 1 -# ---------------------------------------------------------------------------------------------- -# Resolve remote IP (RESTORED ORIGINAL LOGIC) -# ---------------------------------------------------------------------------------------------- -log_info "Resolving remote IP..." +# ----------------------------- HOST ----------------------------- +detect_hosts +resolve_remote_ip -REMOTE_IP="$(getent hosts "$REMOTE_HOST" | awk '{print $1}')" +# ----------------------------- PROFILE ----------------------------- +PROFILE_NAME=$(basename "$DIRECTORY" | tr '[:upper:]' '[:lower:]') -if [[ -z "$REMOTE_IP" ]]; then - log_error "Failed to resolve remote host: $REMOTE_HOST" +MAX_RSYNC_PROCS=${PROFILE_MAX_PROCS[$PROFILE_NAME]:-$MAX_RSYNC_PROCS} +BW_LIMIT=${PROFILE_BW_LIMIT[$PROFILE_NAME]:-$BW_LIMIT} +CRITICAL_CONTAINER_NAMES=(${PROFILE_CRITICAL_CONTAINER_NAMES[$PROFILE_NAME]}) +DELAYED_CONTAINERS=(${PROFILE_DELAYED_CONTAINERS[$PROFILE_NAME]}) +CONTAINER_DELAY=${PROFILE_CONTAINER_DELAY[$PROFILE_NAME]:-$CONTAINER_DELAY} +RETRY_COUNT=${PROFILE_RETRY_COUNT[$PROFILE_NAME]:-$RETRY_COUNT} +SLEEP=${PROFILE_SLEEP[$PROFILE_NAME]:-$SLEEP} +EXCLUDE_DIRS=(${PROFILE_EXCLUDE_DIRS[$PROFILE_NAME]:-${EXCLUDE_DIRS[@]}}) + +# ----------------------------- STATUS ----------------------------- +if [[ "${SHOW_STATUS:-false}" == true ]]; then + show_status + exit 0 +fi + +# ----------------------------- HEADER ----------------------------- +echo +echo "$ICON_RUN Sync Starting" +echo "Source: $DIRECTORY" +echo "Remote: $REMOTE_SERVER:$DIRECTORY" +echo "Profile: $PROFILE_NAME" +echo "Dry Run: $DRY_RUN" + +# ----------------------------- REMOTE CHECK FIX ----------------------------- +echo "$ICON_GEAR Checking remote..." + +REMOTE_OK=false + +for i in $(seq 1 "$RETRY_COUNT"); do + if ping -c 1 "$REMOTE_SERVER" &>/dev/null; then + success "Remote reachable" + REMOTE_OK=true + break + fi + warn "Retry $i/$RETRY_COUNT" + sleep "$SLEEP" +done + +if [[ "$REMOTE_OK" != true ]]; then + error "Remote unreachable" exit 1 fi -log_info "Remote IP: $REMOTE_IP" +# ----------------------------- RSYNC LIMIT ----------------------------- +wait_for_rsync() { + for i in $(seq 1 "$RETRY_COUNT"); do + COUNT=$(pgrep -fc "rsync.*root@${REMOTE_SERVER}" || true) -# ---------------------------------------------------------------------------------------------- -# Config -# ---------------------------------------------------------------------------------------------- -PROFILE="${1:-arrs_stack}" + if [[ "$COUNT" -ge "$MAX_RSYNC_PROCS" ]]; then + warn "Waiting rsync slot ($COUNT)" + sleep "$SLEEP" + else + return 0 + fi + done -SOURCE_PATH="${SOURCE_PATH:-/mnt/user/appdata-Failover/Arrs_Stack}" -REMOTE_PATH="${REMOTE_PATH:-/mnt/user/appdata-Failover/Arrs_Stack}" -REMOTE_USER="${REMOTE_USER:-root}" + error "Too many rsync processes" + exit 1 +} -log_info "Sync Starting" -log_info "Source: $SOURCE_PATH" -log_info "Remote: $REMOTE_IP:$REMOTE_PATH" -log_info "Profile: $PROFILE" -log_info "Dry Run: ${DRY_RUN:-false}" +wait_for_rsync -# ---------------------------------------------------------------------------------------------- -# Remote check -# ---------------------------------------------------------------------------------------------- -log_info "Checking remote..." +# ----------------------------- RUN ----------------------------- +stop_containers -ssh -o BatchMode=yes -o ConnectTimeout=5 \ - "${REMOTE_USER}@${REMOTE_IP}" "echo ok" >/dev/null 2>&1 +get_rsync_opts -log_ok "Remote reachable" +for ex in "${EXCLUDE_DIRS[@]}"; do + RSYNC_OPTS+=(--exclude="$ex") +done -# ---------------------------------------------------------------------------------------------- -# Stop containers (unchanged behavior) -# ---------------------------------------------------------------------------------------------- -if declare -f stop_containers >/dev/null 2>&1; then - log_info "Stopping containers..." - stop_containers "$PROFILE" || true -fi +[[ "$DRY_RUN" == true ]] && RSYNC_OPTS+=("--dry-run") -# ---------------------------------------------------------------------------------------------- -# RSYNC -# ---------------------------------------------------------------------------------------------- -log_info "Running rsync..." +echo "$ICON_RUN Running rsync..." -RSYNC_OPTS="-aHAX --delete --numeric-ids" +START=$(date +%s) -if [[ "${DRY_RUN:-false}" == "true" ]]; then - RSYNC_OPTS="$RSYNC_OPTS -n" -fi +for i in $(seq 1 "$RETRY_COUNT"); do + if rsync "${RSYNC_OPTS[@]}" \ + -e "ssh -i $SSH_KEY -T -o Compression=no -o IPQoS=throughput" \ + "$DIRECTORY" "root@${REMOTE_SERVER}:$DIRECTORY"; then -rsync $RSYNC_OPTS \ - -e "ssh" \ - "$SOURCE_PATH/" \ - "${REMOTE_USER}@${REMOTE_IP}:${REMOTE_PATH}/" + success "Rsync complete" + break + else + warn "Rsync failed ($i/$RETRY_COUNT)" + sleep "$SLEEP" + fi +done -log_ok "Rsync complete" +start_containers -# ---------------------------------------------------------------------------------------------- -# Start containers (unchanged) -# ---------------------------------------------------------------------------------------------- -if declare -f start_containers >/dev/null 2>&1; then - log_info "Starting containers..." - start_containers "$PROFILE" || true -fi - -log_ok "Sync finished successfully" \ No newline at end of file +END=$(date +%s) +echo +echo "===== SUMMARY =====" +echo "Directory: $DIRECTORY" +echo "Profile: $PROFILE_NAME" +echo "Duration: $((END-START))s" +echo "Status: DONE" +echo "===================" \ No newline at end of file