#!/bin/bash #----------------------------------------------------------------------------------------------- # --------------------- Common Shared Functions for Unraid Scripts ----------------------------- #----------------------------------------------------------------------------------------------- #----------------- User Variables, Please adjust in Master.conf as needed ---------------------- #----------------------------------------------------------------------------------------------- # # Nothing to adjust here, all user variables should be in Master.conf # # This is just a script that has all common functions and logic that are shared # between the different scripts. # # This way we can avoid code duplication and have a single source # of truth for all common functions and logic. #----------------------------------------------------------------------------------------------- #---------------End Of User Variables, Please adjust in Master.conf as needed ------------------ #----------------------------------------------------------------------------------------------- # Load Master.conf load_master_conf() { local script_dir script_dir="$(cd "$(dirname "${BASH_SOURCE[1]}")" && pwd)" local master_conf="$script_dir/../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 args 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 } # Host and Remote 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 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 dynamically 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 # Determine SSH Key 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" }