diff --git a/Rsync/rsync.sh b/Rsync/rsync.sh index 5594735..c560f7b 100644 --- a/Rsync/rsync.sh +++ b/Rsync/rsync.sh @@ -1,17 +1,14 @@ #!/bin/bash set -e - -#----------------------------------------------------------------------------------------------- -# --------------------------- Core Rsync Script for Unraid ------------------------------------- #----------------------------------------------------------------------------------------------- #----------------- User Variables, Please adjust in Master.conf as needed ---------------------- #----------------------------------------------------------------------------------------------- +# This is the main Core Rsync script # # User variables can be adjusted in Master.conf -# # Scripts now just contain runtime logic # -# This new setup allows for profiles and arguments to use the core script +# This allows for profiles and multiple things to use the core script # Use arguments in unRAID User Plugin for directory # Example: /mnt/user/appdata/unraid_scripts/Rsync/rsync.sh /mnt/user/appdata-test/Arrs/ # @@ -19,31 +16,56 @@ set -e # If the last name /Arrs/ matches a profile in Master.conf, then profile defaults are used # Otherwise, global configuration in Master.conf is used #----------------------------------------------------------------------------------------------- -#---------------End Of User Variables, Please adjust in Master.conf as needed ------------------ +#---------------End Of User Variables ---------------------------------------------------------- #----------------------------------------------------------------------------------------------- +# Detect script directory SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -source "$SCRIPT_DIR/../common.sh" -# Load central config -load_master_conf +# Load Master.conf +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 # Input Arguments DIRECTORY="$1" if [[ -z "$DIRECTORY" ]]; then - echo "Usage: $0 [--dry-run|-n] [VAR=value ...]" + echo "Usage: $0 [--dry-run] [VAR=value ...]" exit 1 fi -shift # remove DIRECTORY -# Parse CLI args (flags + VAR=value) -parse_args "$@" +# Optional dry-run +DRY_RUN=false +shift 1 +if [[ "$1" == "--dry-run" ]]; then + DRY_RUN=true + shift 1 +fi + +# Optional variable overrides: VAR=value +for ARG in "$@"; do + if [[ "$ARG" == *=* ]]; then + VAR_NAME="${ARG%%=*}" + VAR_VALUE="${ARG#*=}" + if declare -p "$VAR_NAME" &>/dev/null; then + eval "$VAR_NAME=\"$VAR_VALUE\"" + echo "Overriding $VAR_NAME -> $VAR_VALUE" + else + echo "Warning: Unknown variable $VAR_NAME, ignoring." + fi + fi +done # Determine profile PROFILE_NAME=$(basename "$DIRECTORY" | tr '[:upper:]' '[:lower:]') echo "Detected profile: $PROFILE_NAME" -# Apply profile defaults or fallback to Master.conf +# Apply profile defaults or fallback to master.conf MAX_RSYNC_PROCS=${PROFILE_MAX_PROCS[$PROFILE_NAME]:-$MAX_RSYNC_PROCS} BW_LIMIT=${PROFILE_BW_LIMIT[$PROFILE_NAME]:-$BW_LIMIT} CRITICAL_CONTAINER_NAMES=(${PROFILE_CRITICAL_CONTAINER_NAMES[$PROFILE_NAME]}) @@ -51,15 +73,9 @@ DELAYED_CONTAINERS=(${PROFILE_DELAYED_CONTAINERS[$PROFILE_NAME]}) CONTAINER_DELAY=${PROFILE_CONTAINER_DELAY[$PROFILE_NAME]:-$CONTAINER_DELAY} RETRY_COUNT=${PROFILE_RETRY_COUNT[$PROFILE_NAME]:-$RETRY_COUNT} SLEEP=${PROFILE_SLEEP[$PROFILE_NAME]:-$SLEEP} +# Allow multiple patterns per profile EXCLUDE_DIRS=(${PROFILE_EXCLUDE_DIRS[$PROFILE_NAME]:-${EXCLUDE_DIRS[@]}}) -# Validate numeric variables -validate_int MAX_RSYNC_PROCS "$MAX_RSYNC_PROCS" -validate_int BW_LIMIT "$BW_LIMIT" -validate_int CONTAINER_DELAY "$CONTAINER_DELAY" -validate_int RETRY_COUNT "$RETRY_COUNT" -validate_int SLEEP "$SLEEP" - echo "Settings: MAX_RSYNC_PROCS=$MAX_RSYNC_PROCS, BW_LIMIT=$BW_LIMIT, CONTAINERS=${CRITICAL_CONTAINER_NAMES[*]}, EXCLUDES=${EXCLUDE_DIRS[*]}" # Dependency check @@ -99,11 +115,7 @@ stop_containers() { if [ "$STATUS" == "true" ]; then echo "Stopping $container" RUNNING_CONTAINERS+=("$container") - if [ "$DRY_RUN" = true ]; then - echo "[DRY-RUN] Would stop container $container" - else - ssh -i "$SSH_KEY" root@"$REMOTE_SERVER" "docker stop $container" - fi + ssh -i "$SSH_KEY" root@"$REMOTE_SERVER" "docker stop $container" fi done } @@ -113,13 +125,9 @@ start_containers() { for container in "${RUNNING_CONTAINERS[@]}"; do if [[ " ${DELAYED_CONTAINERS[*]} " == *" $container "* ]]; then echo "Delaying start of $container by ${CONTAINER_DELAY}s..." - [ "$DRY_RUN" = false ] && sleep "$CONTAINER_DELAY" - fi - if [ "$DRY_RUN" = true ]; then - echo "[DRY-RUN] Would start container $container" - else - ssh -i "$SSH_KEY" root@"$REMOTE_SERVER" "docker start $container" + sleep "$CONTAINER_DELAY" fi + ssh -i "$SSH_KEY" root@"$REMOTE_SERVER" "docker start $container" done } diff --git a/common.sh b/common.sh index 76cc000..4733399 100644 --- a/common.sh +++ b/common.sh @@ -1,13 +1,14 @@ #!/bin/bash #----------------------------------------------------------------------------------------------- -#--------------------- Common Shared Functions ------------------------------------------------- +# Common Shared Functions for Unraid Scripts #----------------------------------------------------------------------------------------------- -# Load Master.conf +# Load Master.conf relative to calling script 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 @@ -19,7 +20,7 @@ load_master_conf() { fi } -# Parse CLI arguments +# Parse CLI arguments (flags + VAR=value overrides) parse_args() { DRY_RUN=${DRY_RUN:-false} @@ -29,40 +30,48 @@ parse_args() { 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" + if [[ "$VAR_NAME" =~ ^[A-Za-z_][A-Za-z0-9_]*$ ]]; then + printf -v "$VAR_NAME" '%s' "$VAR_VALUE" + echo "Overriding $VAR_NAME -> $VAR_VALUE" + else + echo "Warning: Invalid variable name $VAR_NAME" + fi else echo "Warning: Unknown variable $VAR_NAME, ignoring." fi else case "$ARG" in - --dry-run|-n) DRY_RUN=true ;; + --dry-run|-n) + DRY_RUN=true + ;; --help|-h) echo "Usage: script [--dry-run|-n] [VAR=value ...]" - exit 0 ;; + exit 0 + ;; *) - echo "Warning: Unknown argument $ARG" ;; + echo "Warning: Unknown argument $ARG" + ;; esac fi done } -# Validate integer +# Validate integer (non-negative) 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 +# Optional: 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 -} - +} \ No newline at end of file