#!/bin/bash #----------------------------------------------------------------------------------------------- # --------------------- Common Shared Functions for Unraid Scripts ----------------------------- #----------------------------------------------------------------------------------------------- # This file contains ONLY reusable logic. # No code should execute on load — only functions. # All user configuration lives in Master.conf #----------------------------------------------------------------------------------------------- #----------------------------------------------------------------------------------------------- # Load Master.conf #----------------------------------------------------------------------------------------------- #----------------------------------------------------------------------------------------------- # Load Master.conf reliably #----------------------------------------------------------------------------------------------- # Load Master.conf load_master_conf() { # Hardcode the full path to your Master.conf local master_conf="/mnt/user/appdata/unraid_scripts/Master.conf" if [ -f "$master_conf" ]; then source "$master_conf" echo "Loaded Master.conf from $master_conf" else echo "Error: Master.conf not found at $master_conf" exit 1 fi } # Parse CLI arguments (flags + VAR=value overrides) parse_args() { DRY_RUN=${DRY_RUN:-false} for ARG in "$@"; do if [[ "$ARG" == *=* ]]; then local VAR_NAME="${ARG%%=*}" local VAR_VALUE="${ARG#*=}" if declare -p "$VAR_NAME" &>/dev/null; then printf -v "$VAR_NAME" '%s' "$VAR_VALUE" echo "Overriding $VAR_NAME -> $VAR_VALUE" else echo "Warning: Unknown variable $VAR_NAME, ignoring." fi else case "$ARG" in --dry-run|-n) DRY_RUN=true ;; --help|-h) echo "Usage: script [--dry-run|-n] [VAR=value ...]" exit 0 ;; *) echo "Warning: Unknown argument $ARG" ;; esac fi done } # Validate integer validate_int() { local name="$1" local value="$2" if ! [[ "${value:-}" =~ ^[0-9]+$ ]]; then echo "Error: $name must be a non-negative integer." exit 1 fi } # Require variable to be set require_var() { local var="$1" if [[ -z "${!var:-}" ]]; then echo "Error: Required variable $var is not set." exit 1 fi } # Detect local/remote host and SSH key 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 echo "Error: Local hostname ($LOCAL_HOSTNAME) not recognized." exit 1 fi echo "Local server: $LOCAL_SERVER_NAME" echo "Remote server: $REMOTE_SERVER_NAME" # Resolve Tailscale IP REMOTE_SERVER=$(tailscale ip -4 "$REMOTE_SERVER_NAME" 2>/dev/null) if [[ -z "$REMOTE_SERVER" ]]; then echo "Error: Could not resolve Tailscale IP for $REMOTE_SERVER_NAME" exit 1 fi echo "Resolved $REMOTE_SERVER_NAME → $REMOTE_SERVER" # SSH key lookup KEY_ID="$LOCAL_SERVER_NAME|$REMOTE_SERVER_NAME" if [[ -n "${SSH_KEYS[$KEY_ID]}" ]]; then SSH_KEY="${SSH_KEYS[$KEY_ID]}" else echo "Error: No SSH key defined for $LOCAL_SERVER_NAME → $REMOTE_SERVER_NAME" exit 1 fi echo "Using SSH key: $SSH_KEY" }