#!/usr/bin/env bash set -euo DEFAULT_CONFIG_PATH=. # Read default configs from default config file . "${DEFAULT_CONFIG_PATH}"/default-config.ini # Read custom configs from custom config file . "${DEFAULT_CONFIG_PATH}"/config.d/*.ini # For each lifecycle rule, execute a movement using rsync start_movement () { SOURCE_PATH=$1 DESTINATION_PATH=$2 AMINS=$3 find "$SOURCE_PATH" \ ! -type l \ -type f \ -amin +"$AMINS" \ -printf "%P\0" | \ rsync -0 \ --inplace \ --archive \ --mkpath \ --files-from=- \ "$SOURCE_PATH" \ "$DESTINATION_PATH" } MOVEMENT_JSON_PATH=$( readlink -f "${DEFAULT_CONFIG_PATH}/movement.json" ) if ! [[ -f ${MOVEMENT_JSON_PATH} ]]; then echo "Missing movement file. Exiting." exit 1 fi RULE_LENGTH=$( jq '.movements | length' "${MOVEMENT_JSON_PATH}" ) for (( i=0; i<$RULE_LENGTH ; i++ )) do SOURCE_PATH=$( jq -r ".movements[$i].sourcePath" "${MOVEMENT_JSON_PATH}" ) DESTINATION_PATH=$( jq -r ".movements[$i].destinationPath" "${MOVEMENT_JSON_PATH}" ) AMINS=$( jq -r ".movements[$i].amins" "${MOVEMENT_JSON_PATH}" ) start_movement "$SOURCE_PATH" "$DESTINATION_PATH" "$AMINS" done # Run checks and build soft links if ! [[ -d ${MAP_ROOT_DIRECTORY} ]]; then echo "Missing root directory" exit 1 fi GREEN_PATH=$( readlink -f "${MAP_ROOT_DIRECTORY}"/green ) RED_PATH=$( readlink -f "${MAP_ROOT_DIRECTORY}"/red ) BLUE_PATH=$( readlink -f "${MAP_ROOT_DIRECTORY}"/blue ) export GREEN_PATH if ! [[ -d ${GREEN_PATH} ]]; then mkdir "${GREEN_PATH}" fi # Compile storage paths from all the movements readarray -t STORAGE_PATHS \ < <( jq -r '.movements[] | .sourcePath, .destinationPath' "${MOVEMENT_JSON_PATH}" | xargs -n 1 -I {} readlink -e "{}" | sort --unique ) # Build folder structure printf '%s\0' "${STORAGE_PATHS[@]}" | \ xargs -0 -n 1 bash -c 'find "$0" -type d -printf "%P\0"' | \ sort --unique --zero-terminated | \ parallel -0 mkdir -p "${GREEN_PATH}"/{} # Build file structure using soft links link_file () { echo "\$1 $1" echo "\$2 $2" echo "\$3 $3" echo "Soft linked to ${1/$2/$3}" /usr/bin/ln -s "$1" "${1/$2/$3}" } export -f link_file for STORAGE_PATH in "${STORAGE_PATHS[@]}" do find "${STORAGE_PATH}" -type f -print0 | \ sort --unique --zero-terminated | \ parallel -0 link_file "{}" "${STORAGE_PATH}" "${GREEN_PATH}" done # Swap blue/green rm -rf "${RED_PATH}" && \ mv "${BLUE_PATH}" "${RED_PATH}" && \ mv "${GREEN_PATH}" "${BLUE_PATH}"