test
This commit is contained in:
@@ -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
|
|
||||||
VAR="${ARG%%=*}"
|
|
||||||
VAL="${ARG#*=}"
|
|
||||||
|
|
||||||
case "$VAR" in
|
|
||||||
LOG)
|
|
||||||
[[ "$VAL" == "true" ]] && ENABLE_LOGGING=true
|
|
||||||
[[ "$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
|
case "$ARG" in
|
||||||
--dry-run|-n) DRY_RUN=true ;;
|
--dry-run|-n) DRY_RUN=true ;;
|
||||||
--log) ENABLE_LOGGING=true ;;
|
--log) ENABLE_LOGGING=true ;;
|
||||||
--no-log) ENABLE_LOGGING=false ;;
|
--no-log) ENABLE_LOGGING=false ;;
|
||||||
--status|--summary) SHOW_STATUS=true ;;
|
--status) SHOW_STATUS=true ;;
|
||||||
*) CLEAN_ARGS+=("$ARG") ;;
|
*) CLEAN_ARGS+=("$ARG") ;;
|
||||||
esac
|
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 "======================="
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user