88 lines
2.4 KiB
Bash
88 lines
2.4 KiB
Bash
#!/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}"
|