#!/bin/bash

set -eo pipefail

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

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

. /etc/fjord/environment

if [ -f /etc/fjord/credentials ];
then
    . /etc/fjord/credentials
fi

USAGE="
    $(basename $0) -p <log_path> -l <log_filename> -m <match_string> -s [<server>]
"

FD_ALERT_LOG_FILENAME=""
FD_ALERT_LOG_PATH=""
FD_ALERT_LOG_MATCH_STRING=""
FD_ALERT_LOG_SRV=""

function error_slack_report() {
    if [ ! -s "${TMP_FILE}" ];
    then
        rm -f "${TMP_FILE}"
        return 0
    fi

    local title="[Alert: ${FD_SRV_ROLE}.${FD_SRV_ENVIRONMENT}]"
    local text="$(cat "${TMP_FILE}" | uniq)"
    local data="$(echo '{"attachments": [{"color": "#ff0000"}]}'\
                | jq --arg title "${title}" --arg text "${text}" '. | .attachments[0].title=$title | .attachments[0].text=$text')"

    curl -s \
         -X POST \
         -H 'Content-type: application/json' \
         --data "${data}" \
         "https://hooks.slack.com/services/${FD_ALERT_LOG_SLACK_TOKEN}"

    rm -f "${TMP_FILE}"
}

while getopts ':hl:p:m:s:' OPT;
do
    case ${OPT} in
    h)
        echo "${USAGE}"
        exit 0
        ;;
    l)
        FD_ALERT_LOG_FILENAME="${OPTARG}"
        ;;
    m)
        FD_ALERT_LOG_MATCH_STRING="${OPTARG}"
        ;;
    p)
        FD_ALERT_LOG_PATH="${OPTARG}"
        ;;
    s)
        FD_ALERT_LOG_SRV="${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_ALERT_LOG_SRV}" ] && [ "${FD_ALERT_LOG_SRV}" != "${FD_SRV_HOSTNAME}" ];
then
    exit 0
fi

if [ -z "${FD_ALERT_LOG_SLACK_TOKEN}" ];
then
    echo "missing slack token" >&2
    echo "${USAGE}" >&2
    exit 1
fi

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

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

if [ -z "${FD_ALERT_LOG_MATCH_STRING}" ];
then
    echo "invalid match string: ${FD_ALERT_LOG_MATCH_STRING}" >&2
    echo "${USAGE}" >&2
    exit 1
fi

TMP_FILE="$(mktemp)"

trap 'error_slack_report "${0}" "${TMP_FILE}"' ERR EXIT

find ${FD_ALERT_LOG_PATH} -type f -name "${FD_ALERT_LOG_FILENAME}" -print0|\
    while read -d $'\0' file;
do
    grep "${FD_ALERT_LOG_MATCH_STRING}" "${file}" | cut -d']' -f2-|sed 's/^\s\+/*** /'|sort -u >> "${TMP_FILE}"
done
