blob: 913794a5dd35ffbc62fb0b5fb0d0de08fe73b331 [file] [log] [blame]
#! /usr/bin/env bash
set -e
# This script wants these variable to be set.
## S3_BUCKET <- The name of the bucket where the backups are stored
## S3_ENDPOINT <- The endpoint of the S3 service
## AWS_ACCESS_KEY_ID <- Access credentials
## AWS_SECRET_ACCESS_KEY <- Access credentials
## DAYS_TO_RETAIN <- The TTL for the backups === number of backups to keep.
# Sanity check to avoid removing all backups.
[[ "$DAYS_TO_RETAIN" -lt 1 ]] && DAYS_TO_RETAIN=1
function get_records {
before_date="$1"
aws s3api list-objects \
--bucket ${S3_BUCKET} \
--endpoint-url ${S3_ENDPOINT} \
--query "Contents[?LastModified<='${before_date}'][].{Key: Key}"
}
function remove_old_backups {
before_date=$(date --iso-8601=seconds -d "-${DAYS_TO_RETAIN} days")
now=$(date --iso-8601=seconds)
del_records=$(get_records "${before_date}")
all_records=$(get_records "${now}")
del_paths=()
all_paths=()
function _jq {
echo ${row} | base64 --decode | jq -r ${1}
}
for row in $(echo "${del_records}" | jq -r '.[] | @base64'); do
del_paths+=($(_jq '.Key'))
done
for row in $(echo "${all_records}" | jq -r '.[] | @base64'); do
all_paths+=($(_jq '.Key'))
done
# Number of backups left if all old backups are removed.
left=$((${#all_paths[@]} - ${#del_paths[@]}))
# We ALWAYS keep N backups even if their TTL has expired!
if (( ${left} < ${DAYS_TO_RETAIN} )); then
num_to_delete=$((${#all_paths[@]} - ${DAYS_TO_RETAIN}))
else
num_to_delete=${#del_paths[@]}
fi
for path in "${del_paths[@]::${num_to_delete}}"; do
aws s3 rm "s3://${S3_BUCKET}/${path}" \
--endpoint-url "${S3_ENDPOINT}"
done
}
# Installs jq.
yum install -y jq
remove_old_backups