#!/bin/bash

set -eo pipefail

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

if [ ! -f /etc/fjord/environment ];
then
    echo 'missing /etc/fjord/environment file' >&2
    exit 1
fi

USAGE="
    $(basename $0) -d <directory> -f <filename> -b [<bucket>] -p [profile] -s [<storage_class>] -e [<ext_del>] -a [<append_ext>]
"

. /etc/fjord/environment

if [ -z "${FD_SRV_REGION}" ];
then
    echo 'invalid FD_SRV_REGION environment variable' >&2
    exit 1
fi

FD_EXPORT_DIR=""
FD_EXPORT_FILENAME=""
FD_EXPORT_BUCKET="$(echo -n "fjord-srv-access-logs-${FD_SRV_ROLE}-${FD_SRV_ENVIRONMENT}-${FD_SRV_REGION}" | tr '.' '-')"
FD_EXPORT_SCLASS="GLACIER"
FD_EXPORT_EXT_DEL='\.log\.[0-9]\+\.gz$'
FD_EXPORT_APPEND_EXT=".log.gz"
FD_EXPORT_PROFILE="${FD_EXPORT_PROFILE:-""}"

if [ "${FD_SRV_PROVIDER}" = "aws" ];
then
    export AWS_DEFAULT_REGION="${FD_SRV_REGION}"
fi

if [ ${#FD_EXPORT_BUCKET} -gt 63 ];
then
    FD_EXPORT_BUCKET="$(echo -n "fjord-srv-access-logs-${FD_SRV_ROLE_SHORT}-${FD_SRV_ENVIRONMENT}-${FD_SRV_REGION}" | tr '.' '-')"
elif [ "$(aws s3 ls "s3://${FD_EXPORT_BUCKET}" 2>&1 | grep -c 'NoSuchBucket')" != "0" ];
then
    FD_EXPORT_BUCKET="$(echo -n "fjord-srv-access-logs-${FD_SRV_ROLE_SHORT}-${FD_SRV_ENVIRONMENT}-${FD_SRV_REGION}" | tr '.' '-')"
fi

if [ ${#FD_EXPORT_BUCKET} -gt 63 ];
then
    FD_EXPORT_BUCKET="$(echo -n "fjord-srv-access-logs-${FD_SRV_ROLE_SHORT}-${FD_SRV_ENVIRONMENT_SHORT}-${FD_SRV_REGION}" | tr '.' '-')"
elif [ "$(aws s3 ls "s3://${FD_EXPORT_BUCKET}" 2>&1 | grep -c 'NoSuchBucket')" != "0" ];
then
    FD_EXPORT_BUCKET="$(echo -n "fjord-srv-access-logs-${FD_SRV_ROLE_SHORT}-${FD_SRV_ENVIRONMENT_SHORT}-${FD_SRV_REGION}" | tr '.' '-')"
fi

while getopts ':hd:f:b:p:s:e:a:' OPT;
do
    case ${OPT} in
    h)
        echo "${USAGE}"
        exit 0
        ;;
    d)
        FD_EXPORT_DIR="${OPTARG}"
        ;;
    f)
        FD_EXPORT_FILENAME="${OPTARG}"
        ;;
    b)
        FD_EXPORT_BUCKET="${OPTARG}"
        ;;
    p)
        FD_EXPORT_PROFILE="${OPTARG}"
        ;;
    s)
        FD_EXPORT_SCLASS="${OPTARG}"
        ;;
    e)
        FD_EXPORT_EXT_DEL="${OPTARG}"
        ;;
    a)
        FD_EXPORT_APPEND_EXT="${OPTARG}"
        ;;
    \?)
        echo "invalid option: -${OPTARG}" >&2
        echo "${USAGE}" >&2
        exit 1
        ;;
    :)
        echo "option -${OPTARG} requires an argument." >&2
        exit 1
        ;;
    esac
done

if [ -z "${FD_EXPORT_DIR}" ] || [ ! -d "${FD_EXPORT_DIR}" ];
then
    echo "invalid directory: ${FD_EXPORT_DIR}" >&2
    echo "${USAGE}" >&2
    exit 1
fi

if [ -z "${FD_EXPORT_FILENAME}" ];
then
    echo "invalid filename pattern: ${FD_EXPORT_FILENAME}" >&2
    echo "${USAGE}" >&2
    exit 1
fi

find "${FD_EXPORT_DIR}" -type f -name "${FD_EXPORT_FILENAME}" -mmin +5 -printf "%T+ %p\0"|\
    sort -n -z|\
    while read -d $'\0' file;
do
    FD_EXPORT_PATH="$(realpath "$(echo -n "${file}"|cut -d' ' -f2-)")"
    FD_EXPORT_DATE="$(stat -c %y "${FD_EXPORT_PATH}"|sed -r 's/^([0-9\-]+).*$/\1/')"
    FD_EXPORT_DATE_PATH="$(echo -n "${FD_EXPORT_DATE}"| tr '-' '/')"
    FD_EXPORT_TIME="$(stat -c %y "${FD_EXPORT_PATH}"|sed -r 's/^.* ([0-9\:]+).*$/\1/;s/:/-/g')"
    FD_EXPORT_BASENAME="$(basename "${FD_EXPORT_PATH}"|sed 's/'"${FD_EXPORT_EXT_DEL}"'//')"
    FD_EXPORT_FULL_PATH="${FD_EXPORT_DATE_PATH}/${FD_SRV_HOSTNAME}/${FD_EXPORT_BASENAME}.${FD_EXPORT_DATE}.${FD_EXPORT_TIME}${FD_EXPORT_APPEND_EXT}"
    aws s3 cp "${FD_EXPORT_PATH}" \
        "s3://${FD_EXPORT_BUCKET}/${FD_EXPORT_FULL_PATH}" \
        --profile=${FD_EXPORT_PROFILE} \
        --storage-class=${FD_EXPORT_SCLASS} \
    && rm -f "${FD_EXPORT_PATH}"
done;
