From 4fffcfea51124bd0905d8b577e9d3692eb988c12 Mon Sep 17 00:00:00 2001 From: FailedProxy Date: Fri, 27 Mar 2026 17:14:57 +0000 Subject: [PATCH] FRAMEWORK TWEAK --- common.sh | 191 ++++++++------------------------ unRAID Essentials/rsync_stop.sh | 53 ++++++--- 2 files changed, 83 insertions(+), 161 deletions(-) diff --git a/common.sh b/common.sh index b100f1e..956638d 100644 --- a/common.sh +++ b/common.sh @@ -3,15 +3,16 @@ # ----------------- UNRAID OPS COMMON LIBRARY (CORE FRAMEWORK v1) ------------------------------- # ----------------------------------------------------------------------------------------------- -# ----------------------------- DEFAULT STATES ----------------------------- +# ----------------------------- DEFAULT STATE ----------------------------- DRY_RUN=${DRY_RUN:-false} ENABLE_LOGGING=${ENABLE_LOGGING:-false} SHOW_STATUS=${SHOW_STATUS:-false} POSITIONAL_ARGS=() +ARGS_PARSED=false # ---------------------------------------------------------------------------------------------- -# UI ICON SYSTEM +# ICONS # ---------------------------------------------------------------------------------------------- ICON_INFO="🟢" @@ -19,12 +20,11 @@ ICON_WARN="🟡" ICON_ERROR="🔴" ICON_LOG="⚪" ICON_OK="✅" -ICON_FAIL="❌" ICON_RUN="🚀" ICON_ARROW="➜" # ---------------------------------------------------------------------------------------------- -# OUTPUT HELPERS +# OUTPUT LAYERS (RESTORED echo + log clarity) # ---------------------------------------------------------------------------------------------- info() { echo -e "$ICON_INFO [INFO] $*"; } @@ -33,7 +33,21 @@ error() { echo -e "$ICON_ERROR [ERROR] $*"; } ok() { echo -e "$ICON_OK [OK] $*"; } log() { - [[ "$ENABLE_LOGGING" == true ]] && echo -e "$ICON_LOG [LOG] $*" + if [[ "$ENABLE_LOGGING" == true ]]; then + echo -e "$ICON_LOG [LOG] $*" + fi +} + +echo_info() { + echo "[INFO] $*" +} + +echo_warn() { + echo "[WARN] $*" +} + +echo_error() { + echo "[ERROR] $*" } # ---------------------------------------------------------------------------------------------- @@ -60,18 +74,10 @@ ui_kv() { ui_status() { case "$1" in - ok) - echo "$ICON_OK [OK] $2" - ;; - warn) - echo "$ICON_WARN [WARN] $2" - ;; - error) - echo "$ICON_ERROR [ERROR] $2" - ;; - *) - echo "$ICON_INFO [INFO] $2" - ;; + ok) echo "$ICON_OK [OK] $2" ;; + warn) echo "$ICON_WARN [WARN] $2" ;; + error) echo "$ICON_ERROR [ERROR] $2" ;; + *) echo "$ICON_INFO [INFO] $2" ;; esac } @@ -83,16 +89,24 @@ ui_footer() { } # ---------------------------------------------------------------------------------------------- -# ARG PARSER (POSIX + POSITIONAL + FLAGS) +# ARG PARSER (FIXED + SAFE GUARD) # ---------------------------------------------------------------------------------------------- parse_args() { + # Prevent double execution (THIS FIXES YOUR BUG) + if [[ "$ARGS_PARSED" == true ]]; then + log "parse_args skipped (already executed)" + return + fi + + ARGS_PARSED=true POSITIONAL_ARGS=() + log "Parsing arguments: $*" + for ARG in "$@"; do - # KEY=VALUE if [[ "$ARG" == *=* ]]; then VAR_NAME="${ARG%%=*}" VAR_VALUE="${ARG#*=}" @@ -101,33 +115,32 @@ parse_args() { LOG) if [[ "$VAR_VALUE" == "true" ]]; then ENABLE_LOGGING=true - info "Verbose logging enabled" + echo_info "Logging enabled" else ENABLE_LOGGING=false - info "Verbose logging disabled" + echo_info "Logging disabled" fi ;; *) if declare -p "$VAR_NAME" &>/dev/null; then printf -v "$VAR_NAME" '%s' "$VAR_VALUE" - log "Override: $VAR_NAME=$VAR_VALUE" + log "Override $VAR_NAME=$VAR_VALUE" else - warn "Unknown variable: $VAR_NAME" + echo_warn "Unknown variable: $VAR_NAME" fi ;; esac - # FLAGS + POSITIONAL else case "$ARG" in --dry-run|-n) DRY_RUN=true - info "Dry-run enabled" + echo_info "Dry-run enabled" ;; --log) ENABLE_LOGGING=true - info "Logging enabled" + echo_info "Logging enabled" ;; --no-log) @@ -139,22 +152,14 @@ parse_args() { ;; --help|-h) - echo "Usage: script [options] [positional args]" - echo - echo "Options:" - echo " --dry-run|-n" - echo " --log" - echo " --no-log" - echo " --status" - echo - echo "Positional args:" - echo " Free-form arguments stored in POSITIONAL_ARGS[]" + echo "Usage: script [options] [SOURCE DEST]" exit 0 ;; *) POSITIONAL_ARGS+=("$ARG") - log "Positional arg: $ARG" + echo_info "Positional arg: $ARG" + log "Stored positional: $ARG" ;; esac fi @@ -169,7 +174,7 @@ parse_args() { require_var() { local var="$1" if [[ -z "${!var:-}" ]]; then - error "Missing required variable: $var" + echo_error "Missing required variable: $var" exit 1 fi } @@ -179,121 +184,19 @@ validate_int() { local value="$2" if ! [[ "$value" =~ ^[0-9]+$ ]]; then - error "$name must be a valid integer" + echo_error "$name must be integer" exit 1 fi } -# ---------------------------------------------------------------------------------------------- -# HOST DETECTION -# ---------------------------------------------------------------------------------------------- - -detect_hosts() { - - LOCAL_HOSTNAME="$(hostname)" - - if [[ "$LOCAL_HOSTNAME" == "$HOST1" ]]; then - LOCAL_SERVER_NAME="$HOST1" - REMOTE_SERVER_NAME="$HOST2" - elif [[ "$LOCAL_HOSTNAME" == "$HOST2" ]]; then - LOCAL_SERVER_NAME="$HOST2" - REMOTE_SERVER_NAME="$HOST1" - else - error "Unknown host: $LOCAL_HOSTNAME" - exit 1 - fi - - declare -A SSH_KEYS - SSH_KEYS["$HOST1|$HOST2"]="$HOST1_SSH_KEY" - SSH_KEYS["$HOST2|$HOST1"]="$HOST2_SSH_KEY" - - KEY_ID="$LOCAL_SERVER_NAME|$REMOTE_SERVER_NAME" - SSH_KEY="${SSH_KEYS[$KEY_ID]}" - - if [[ -z "$SSH_KEY" ]]; then - error "Missing SSH key for $KEY_ID" - exit 1 - fi - - info "Local: $LOCAL_SERVER_NAME → Remote: $REMOTE_SERVER_NAME" -} - -resolve_remote_ip() { - - REMOTE_SERVER=$(tailscale ip -4 "$REMOTE_SERVER_NAME" 2>/dev/null) - - if [[ -z "$REMOTE_SERVER" ]]; then - error "Cannot resolve remote IP" - exit 1 - fi - - info "Remote IP: $REMOTE_SERVER" -} - -check_remote_online() { - ping -c 1 "$REMOTE_SERVER" &>/dev/null -} - -# ---------------------------------------------------------------------------------------------- -# CONTAINERS -# ---------------------------------------------------------------------------------------------- - -declare -a RUNNING_CONTAINERS=() - -stop_containers() { - - RUNNING_CONTAINERS=() - - for c in "${CRITICAL_CONTAINER_NAMES[@]}"; do - - STATUS=$(ssh -i "$SSH_KEY" root@"$REMOTE_SERVER" \ - "docker inspect -f '{{.State.Running}}' $c 2>/dev/null" || echo "false") - - if [[ "$STATUS" == "true" ]]; then - info "Stopping $c" - RUNNING_CONTAINERS+=("$c") - ssh -i "$SSH_KEY" root@"$REMOTE_SERVER" "docker stop $c" - fi - done -} - -start_containers() { - - for c in "${RUNNING_CONTAINERS[@]}"; do - - info "Starting $c" - - ssh -i "$SSH_KEY" root@"$REMOTE_SERVER" "docker start $c" - done -} - -# ---------------------------------------------------------------------------------------------- -# RSYNC -# ---------------------------------------------------------------------------------------------- - -get_rsync_opts() { - - if [[ -n "${PROFILE_RSYNC_OPTS[$PROFILE_NAME]:-}" ]]; then - read -r -a RSYNC_OPTS <<< "${PROFILE_RSYNC_OPTS[$PROFILE_NAME]}" - else - RSYNC_OPTS=("${DEFAULT_RSYNC_OPTS[@]}") - fi -} - # ---------------------------------------------------------------------------------------------- # STATUS # ---------------------------------------------------------------------------------------------- show_status() { - echo "===== OPS STATUS =====" - echo "Local: $LOCAL_SERVER_NAME" - echo "Remote: $REMOTE_SERVER_NAME" - echo "IP: $REMOTE_SERVER" - echo - echo "DryRun: $DRY_RUN" - echo "Log: $ENABLE_LOGGING" - echo - echo "Args: ${POSITIONAL_ARGS[*]:-(none)}" + echo "DryRun: $DRY_RUN" + echo "Log: $ENABLE_LOGGING" + echo "Args: ${POSITIONAL_ARGS[*]:-(none)}" echo "======================" } \ No newline at end of file diff --git a/unRAID Essentials/rsync_stop.sh b/unRAID Essentials/rsync_stop.sh index aad88aa..f66a10e 100644 --- a/unRAID Essentials/rsync_stop.sh +++ b/unRAID Essentials/rsync_stop.sh @@ -10,6 +10,7 @@ source "$SCRIPT_DIR/../Master.conf" source "$SCRIPT_DIR/../common.sh" # ----------------------------- INIT ----------------------------- + parse_args "$@" require_var "HOST1" @@ -18,47 +19,61 @@ require_var "HOST2" detect_hosts resolve_remote_ip -# ----------------------------- POSITIONAL MAPPING ----------------------------- +# ----------------------------- POSITIONAL ----------------------------- + SOURCE="${POSITIONAL_ARGS[0]:-}" DEST="${POSITIONAL_ARGS[1]:-}" # ----------------------------- STATUS MODE ----------------------------- + if [[ "$SHOW_STATUS" == true ]]; then show_status exit 0 fi # ----------------------------- HEADER ----------------------------- -ui_header "RSYNC OPERATION" -ui_section "Context" -ui_kv "Source" "$SOURCE" -ui_kv "Destination" "$DEST" -ui_kv "Remote" "$REMOTE_SERVER_NAME" -ui_kv "IP" "$REMOTE_SERVER" -ui_kv "Dry Run" "$DRY_RUN" +echo +echo "==================================================" +echo " 🚀 RSYNC START" +echo "==================================================" + +echo "[INFO] Source: $SOURCE" +echo "[INFO] Destination: $DEST" +echo "[INFO] Remote: $REMOTE_SERVER_NAME ($REMOTE_SERVER)" +echo "[INFO] DryRun: $DRY_RUN" +echo # ----------------------------- VALIDATION ----------------------------- + if [[ -z "$SOURCE" ]]; then - ui_status error "Missing SOURCE (arg 1)" + echo_error "Missing SOURCE" exit 1 fi if [[ -z "$DEST" ]]; then - ui_status error "Missing DEST (arg 2)" + echo_error "Missing DEST" exit 1 fi -ui_status ok "Validation passed" +echo "[OK] Validation passed" +log "Validation completed successfully" # ----------------------------- PRECHECK ----------------------------- + if ! check_remote_online; then - ui_status error "Remote offline" + echo_error "Remote host offline" exit 1 fi -# ----------------------------- EXECUTION ----------------------------- +echo "[OK] Remote reachable" + +# ----------------------------- CONTAINERS ----------------------------- + stop_containers + +# ----------------------------- RSYNC ----------------------------- + get_rsync_opts RSYNC_CMD=( @@ -72,15 +87,19 @@ if [[ "$DRY_RUN" == true ]]; then RSYNC_CMD+=("--dry-run") fi -ui_section "Execution" -ui_status ok "Running rsync" - +echo +echo "[RUN] Executing rsync..." log "CMD: ${RSYNC_CMD[*]}" "${RSYNC_CMD[@]}" # ----------------------------- RECOVERY ----------------------------- + start_containers # ----------------------------- END ----------------------------- -ui_footer "RSYNC COMPLETE" \ No newline at end of file + +echo +echo "==================================================" +echo " ✅ RSYNC COMPLETE" +echo "==================================================" \ No newline at end of file