#!/bin/bash # ----------------------------------------------------------------------------------------------- # ----------------- UNRAID OPS COMMON LIBRARY (CORE FRAMEWORK v1) ------------------------------- # ----------------------------------------------------------------------------------------------- # ----------------------------- DEFAULT STATE ----------------------------- DRY_RUN=${DRY_RUN:-false} ENABLE_LOGGING=${ENABLE_LOGGING:-false} SHOW_STATUS=${SHOW_STATUS:-false} POSITIONAL_ARGS=() ARGS_PARSED=false # ---------------------------------------------------------------------------------------------- # ICONS # ---------------------------------------------------------------------------------------------- ICON_INFO="🟢" ICON_WARN="🟡" ICON_ERROR="🔴" ICON_LOG="⚪" ICON_OK="✅" ICON_RUN="🚀" ICON_ARROW="➜" # ---------------------------------------------------------------------------------------------- # OUTPUT LAYERS (RESTORED echo + log clarity) # ---------------------------------------------------------------------------------------------- info() { echo -e "$ICON_INFO [INFO] $*"; } warn() { echo -e "$ICON_WARN [WARN] $*"; } error() { echo -e "$ICON_ERROR [ERROR] $*"; } ok() { echo -e "$ICON_OK [OK] $*"; } log() { if [[ "$ENABLE_LOGGING" == true ]]; then echo -e "$ICON_LOG [LOG] $*" fi } echo_info() { echo "[INFO] $*" } echo_warn() { echo "[WARN] $*" } echo_error() { echo "[ERROR] $*" } # ---------------------------------------------------------------------------------------------- # UI LAYER # ---------------------------------------------------------------------------------------------- ui_header() { echo echo "==================================================" echo " $ICON_RUN $*" echo "==================================================" } ui_section() { echo echo "--------------------------------------------------" echo " $ICON_ARROW $*" echo "--------------------------------------------------" } ui_kv() { printf " %-18s %s\n" "$1:" "$2" } 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" ;; esac } ui_footer() { echo echo "==================================================" echo " $ICON_OK $*" echo "==================================================" } # ---------------------------------------------------------------------------------------------- # 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 if [[ "$ARG" == *=* ]]; then VAR_NAME="${ARG%%=*}" VAR_VALUE="${ARG#*=}" case "$VAR_NAME" in LOG) if [[ "$VAR_VALUE" == "true" ]]; then ENABLE_LOGGING=true echo_info "Logging enabled" else ENABLE_LOGGING=false 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" else echo_warn "Unknown variable: $VAR_NAME" fi ;; esac else case "$ARG" in --dry-run|-n) DRY_RUN=true echo_info "Dry-run enabled" ;; --log) ENABLE_LOGGING=true echo_info "Logging enabled" ;; --no-log) ENABLE_LOGGING=false ;; --status|--summary) SHOW_STATUS=true ;; --help|-h) echo "Usage: script [options] [SOURCE DEST]" exit 0 ;; *) POSITIONAL_ARGS+=("$ARG") echo_info "Positional arg: $ARG" log "Stored positional: $ARG" ;; esac fi done } # ---------------------------------------------------------------------------------------------- # VALIDATION # ---------------------------------------------------------------------------------------------- require_var() { local var="$1" if [[ -z "${!var:-}" ]]; then echo_error "Missing required variable: $var" exit 1 fi } validate_int() { local name="$1" local value="$2" if ! [[ "$value" =~ ^[0-9]+$ ]]; then echo_error "$name must be integer" exit 1 fi } # ---------------------------------------------------------------------------------------------- # STATUS # ---------------------------------------------------------------------------------------------- show_status() { echo "===== OPS STATUS =====" echo "DryRun: $DRY_RUN" echo "Log: $ENABLE_LOGGING" echo "Args: ${POSITIONAL_ARGS[*]:-(none)}" echo "======================" }