#!/bin/bash

# This script lists objects stored in the Glacier storage class within an S3 bucket.
# It optionally filters the list based on a specified directory within the bucket.
# The output is saved to a text file with a sanitized name based on the bucket and directory.

# Example usage:
# ./list-glacier-objects.sh my-bucket my-directory 
# (Lists objects in the 'my-directory' directory within the 'my-bucket' bucket)
# ./list-glacier-objects.sh my-bucket 
# (Lists all objects in the 'my-bucket' bucket)

# Check the number of arguments 
if [[ $# -lt 1 || $# -gt 2 ]]; then
    echo "Usage: $0 <bucket_name> [directory_name]"
    exit 1
fi

# Retrieve the arguments 
BUCKET="$1"
DIRECTORY="$2"

# Function to "sanitize" names for the output file
sanitize_name() {
    echo "$1" | tr -dc '[:alnum:]-_.' 
}

# Construct the output file name
SANITIZED_BUCKET=$(sanitize_name "$BUCKET")
if [[ -n "$DIRECTORY" ]]; then
    SANITIZED_DIRECTORY=$(sanitize_name "$DIRECTORY")
    OUTPUT_FILE="${SANITIZED_BUCKET}_${SANITIZED_DIRECTORY}_glacier-restore.txt"
else
    OUTPUT_FILE="${SANITIZED_BUCKET}_glacier-restore.txt"
fi

# Construct the AWS CLI command
COMMAND="aws s3api list-objects-v2 --bucket $BUCKET --query \"Contents[?StorageClass=='GLACIER']\""

# Add the prefix if a directory is specified
if [[ -n "$DIRECTORY" ]]; then
    COMMAND+=" --prefix $DIRECTORY"
fi

# Finalize the command with formatted output
COMMAND+=" --output text | awk '{print \$2}' > $OUTPUT_FILE"

# Execute the command
eval $COMMAND

# Confirmation message
echo "List of Glacier objects saved in $OUTPUT_FILE"
