This commit is contained in:
2026-03-27 21:34:03 +00:00
parent f70433a1d4
commit 1d57613a42
+56 -61
View File
@@ -13,17 +13,22 @@ ICON_STOP="🛑"
ICON_STOPPED="🟢" ICON_STOPPED="🟢"
ICON_SYNC="🔄" ICON_SYNC="🔄"
# ----------------------------- OUTPUT ----------------------------- # ----------------------------- LOGGING -----------------------------
info() { echo "$ICON_INFO [INFO] $*"; } info() { echo "$ICON_INFO [INFO] $*"; }
warn() { echo "$ICON_WARN [WARN] $*"; } warn() { echo "$ICON_WARN [WARN] $*"; }
error() { echo "$ICON_ERROR [ERROR] $*"; } error() { echo "$ICON_ERROR [ERROR] $*"; }
success() { echo "$ICON_SUCCESS [OK] $*"; } success() { echo "$ICON_SUCCESS [OK] $*"; }
log() { [[ "${ENABLE_LOGGING:-false}" == true ]] && echo "[LOG] $*"; }
log() { # ----------------------------- LOAD MASTER CONFIG -----------------------------
[[ "${ENABLE_LOGGING:-false}" == true ]] && echo "[LOG] $*" # MUST be defined before calling engine
} # Example:
# source /boot/config/master.conf
if [[ -n "${MASTER_CONF_PATH:-}" ]]; then
source "$MASTER_CONF_PATH"
fi
# ----------------------------- ARG PARSER ----------------------------- # ----------------------------- ARG PARSING -----------------------------
parse_args() { parse_args() {
ENABLE_LOGGING=${ENABLE_LOGGING:-false} ENABLE_LOGGING=${ENABLE_LOGGING:-false}
DRY_RUN=${DRY_RUN:-false} DRY_RUN=${DRY_RUN:-false}
@@ -32,43 +37,18 @@ parse_args() {
CLEAN_ARGS=() CLEAN_ARGS=()
for ARG in "$@"; do for ARG in "$@"; do
if [[ "$ARG" == *=* ]]; then case "$ARG" in
VAR="${ARG%%=*}" --dry-run|-n) DRY_RUN=true ;;
VAL="${ARG#*=}" --log) ENABLE_LOGGING=true ;;
--no-log) ENABLE_LOGGING=false ;;
case "$VAR" in --status) SHOW_STATUS=true ;;
LOG) *) CLEAN_ARGS+=("$ARG") ;;
[[ "$VAL" == "true" ]] && ENABLE_LOGGING=true esac
[[ "$VAL" == "false" ]] && ENABLE_LOGGING=false
;;
*)
if declare -p "$VAR" &>/dev/null; then
printf -v "$VAR" '%s' "$VAL"
log "Set $VAR=$VAL"
else
warn "Unknown variable: $VAR"
fi
;;
esac
else
case "$ARG" in
--dry-run|-n) DRY_RUN=true ;;
--log) ENABLE_LOGGING=true ;;
--no-log) ENABLE_LOGGING=false ;;
--status|--summary) SHOW_STATUS=true ;;
*) CLEAN_ARGS+=("$ARG") ;;
esac
fi
done done
PARSED_ARGS=("${CLEAN_ARGS[@]}") PARSED_ARGS=("${CLEAN_ARGS[@]}")
} }
# ----------------------------- VALIDATION -----------------------------
require_var() {
[[ -z "${!1:-}" ]] && error "Missing required: $1" && exit 1
}
# ----------------------------- HOST DETECTION ----------------------------- # ----------------------------- HOST DETECTION -----------------------------
detect_hosts() { detect_hosts() {
LOCAL_HOSTNAME="$(hostname)" LOCAL_HOSTNAME="$(hostname)"
@@ -95,7 +75,7 @@ detect_hosts() {
info "Host: $LOCAL_SERVER_NAME$REMOTE_SERVER_NAME" info "Host: $LOCAL_SERVER_NAME$REMOTE_SERVER_NAME"
} }
# ----------------------------- REMOTE ----------------------------- # ----------------------------- REMOTE RESOLVE -----------------------------
resolve_remote_ip() { resolve_remote_ip() {
REMOTE_SERVER=$(tailscale ip -4 "$REMOTE_SERVER_NAME" 2>/dev/null) REMOTE_SERVER=$(tailscale ip -4 "$REMOTE_SERVER_NAME" 2>/dev/null)
[[ -z "$REMOTE_SERVER" ]] && error "Failed to resolve remote IP" && exit 1 [[ -z "$REMOTE_SERVER" ]] && error "Failed to resolve remote IP" && exit 1
@@ -168,57 +148,72 @@ wait_for_rsync() {
exit 1 exit 1
} }
# ----------------------------- PROFILE CONFIG ----------------------------- # -----------------------------------------------------------------------------------------------
declare -A PROFILE_BW_LIMIT=( # ----------------------------- DEFAULT RSYNC OPTIONS -------------------------------------------
[arrs_stack]=5000 # -----------------------------------------------------------------------------------------------
[critical-data]=9500
[gmer4lfe]=8000
[important-data]=9500
[emby]=8000
)
DEFAULT_RSYNC_OPTS=( DEFAULT_RSYNC_OPTS=(
--archive --archive
--delete --delete
--partial --partial
--compress --compress
--info=progress2
--stats
) )
# ----------------------------- RSYNC OPTIONS ----------------------------- # -----------------------------------------------------------------------------------------------
# ----------------------------- PROFILE HANDLING (FROM MASTER.CONF) ------------------------------
# -----------------------------------------------------------------------------------------------
get_rsync_opts() { get_rsync_opts() {
RSYNC_OPTS=()
# base profile options
RSYNC_OPTS=("${DEFAULT_RSYNC_OPTS[@]}") RSYNC_OPTS=("${DEFAULT_RSYNC_OPTS[@]}")
# bwlimit (FIXED + ALWAYS APPLIED) # Ensure profile map exists
if [[ -z "${PROFILE_BW_LIMIT[*]}" ]]; then
warn "PROFILE_BW_LIMIT missing from Master.conf - using unlimited"
declare -A PROFILE_BW_LIMIT
fi
BW_LIMIT="${PROFILE_BW_LIMIT[$PROFILE_NAME]:-0}" BW_LIMIT="${PROFILE_BW_LIMIT[$PROFILE_NAME]:-0}"
if [[ "$BW_LIMIT" -gt 0 ]]; then if [[ "$BW_LIMIT" -gt 0 ]]; then
RSYNC_OPTS+=(--bwlimit="$BW_LIMIT") RSYNC_OPTS+=(--bwlimit="$BW_LIMIT")
log "bwlimit=${BW_LIMIT}KB/s applied" log "bwlimit=${BW_LIMIT}KB/s applied (profile: $PROFILE_NAME)"
else
log "bwlimit unlimited (profile: $PROFILE_NAME)"
fi fi
# clean progress mode
if [[ "${ENABLE_PROGRESS:-false}" == true ]]; then if [[ "${ENABLE_PROGRESS:-false}" == true ]]; then
RSYNC_OPTS+=(
--quiet
--info=progress2,name0,stats0
--human-readable
--no-inc-recursive
)
log "Progress mode enabled" log "Progress mode enabled"
fi fi
} }
# ----------------------------- RSYNC EXECUTION (FIXED OUTPUT) -----------------------------
run_rsync() {
wait_for_rsync
get_rsync_opts
echo "🚀 Running rsync..."
# IMPORTANT FIX:
# - no --quiet
# - no output suppression
# - direct execution for real-time streaming
rsync "${RSYNC_OPTS[@]}" \
"$SRC/" \
"root@$REMOTE_SERVER:$DEST/"
}
# ----------------------------- STATUS ----------------------------- # ----------------------------- STATUS -----------------------------
show_status() { show_status() {
echo "===== STATUS =====" echo "===== SYNC STATUS ====="
echo "Local: $LOCAL_SERVER_NAME" echo "Local: $LOCAL_SERVER_NAME"
echo "Remote: $REMOTE_SERVER_NAME" echo "Remote: $REMOTE_SERVER_NAME"
echo "IP: $REMOTE_SERVER" echo "IP: $REMOTE_SERVER"
echo "Profile: $PROFILE_NAME" echo "Profile: $PROFILE_NAME"
echo "Progress: ${ENABLE_PROGRESS:-false}" echo "Progress: ${ENABLE_PROGRESS:-false}"
echo "==================" echo "======================="
} }