#!/usr/bin/env bash

CLN_REGISTER_SERVER="https://cln.cloudlinux.com/cln/api/els/server/register"
CLN_UNREGISTER_SERVER="https://cln.cloudlinux.com/cln/api/els/server/unregister"
LICENSE=""
HOSTNAME=`hostname`
AUTH_CONF_PATH="/etc/yum/vars/elstoken"
PACKAGE_URI="https://repo.tuxcare.com/centos7-els/els-os-release-install.el7.x86_64.rpm"

show_usage() {
    echo 'Usage: install-centos7-els-repo.sh [OPTION]...'
    echo ''
    echo '  -l, --license-key   User license key'
    echo '  -f, --force         Force re-register if ELS is already installed'
    echo '  -d, --delete        Delete ELS from server'
    echo '  -v, --validate      Check if ELS is installed'
    echo '  -h, --help          Show this message and exit'
}

els_installed() {
    echo "Checking if els-os-release is already installed... "
    if yum list installed els-os-release 2>/dev/null; then
        echo "els-os-release package is already installed."
        return 0
    fi
    return 1
}

install_els_os_release() {
    TEMP_RPM=$(mktemp /tmp/els-os-release-XXXXXX.rpm)

    trap 'rm -f "$TEMP_RPM"' EXIT

    if ! curl -fsSL -o "$TEMP_RPM" "$PACKAGE_URI"; then
        echo "Error: Couldn't download els-os-release.rpm"
        exit 1
    fi

    if ! yum install -y "$TEMP_RPM"; then
        echo "Error: Couldn't install els-os-release"
        exit 3
    fi
}

remove_els_os_release() {
    echo "Removing els-os-release package... "
    if yum remove -y els-os-release; then
        echo "Ok"
    else
        echo "Error (Could not remove els-os-release package)"
        exit 1
    fi

    echo "Removing authentication configuration file... "
    if rm -f "$AUTH_CONF_PATH"; then
        echo "Ok"
    else
        echo "Error (Could not remove auth configuration file: $AUTH_CONF_PATH)"
        exit 1
    fi
}

if [[ $# -eq 0 ]]; then
    echo "An option should be specified. See usage -h, --help."
    exit 1
fi

for opt in "$@"; do
    case ${opt} in
        -l|--license-key)
            LICENSE=$2 ; shift ;;
        -f|--force)
            FORCE=true ; shift ;;
        -d|--delete)
            DELETE=true ; shift ;;
        -v|--validate)
            VALIDATE=true ; shift ;;
        -h|--help)
            show_usage ; exit 0 ;;
        -*|--*)
            echo; echo "Unrecognized option: ${opt}"; show_usage ; exit 1 ;;
    esac
done

if [[ -n $VALIDATE ]]; then
    if els_installed; then
        echo "Server is registered with token $(cat /etc/yum/vars/elstoken)"
        exit 0
    else
        echo "Server is not registered"
        exit 1
    fi
fi

if [[ -n $FORCE ]]; then
    if ! remove_els_os_release; then
        exit 1
    fi
fi

if [[ -n $DELETE ]]; then
    CLN_UNREGISTER=""
    if els_installed; then
        CLN_UNREGISTER=$(curl -i -s -X POST "$CLN_UNREGISTER_SERVER?token=$(cat /etc/yum/vars/elstoken)")
    fi
    if [[ ! "$CLN_UNREGISTER" == *"200 OK"* ]]; then
        if [[ -z $CLN_UNREGISTER ]]; then
            echo "DELETE: elstoken wasn't found. Server is not registered"
        else
            echo "Get incorrect status from CLN: $CLN_UNREGISTER"
        fi
        exit 1
    else
        echo "Unregister successfully"
    fi

    if ! remove_els_os_release; then
        exit 1
    fi
    echo "CentOS ELS deleted successfully"
    exit
fi

# check centos-release file
if [[ ! -f /etc/centos-release ]]; then
    echo "This server is not RHEL based"
    exit 1
fi

# check centos version
centos_release="$(cat /etc/centos-release)"
if [[ ! "${centos_release}" == *"CentOS Linux release 7.9"* ]]; then
    echo "This server is not CentOS Linux release 7.9"
    exit 1
fi

# check license key
if [[ -z $LICENSE ]]; then
    echo "License key should be specified with -l, --license-key."
    echo "See -h, --help."
    exit 1
elif [[ ! "$LICENSE" == *"CENTOS7"* ]]; then
    echo "Incorrect license key"
    exit 1
fi

# check if els is installed
if els_installed; then
    echo "This server has already installed ELS repo and token"
    echo "For re-registration license run script with --force"
    exit 1
fi

# get token
CLN_REGISTER=$(curl -i -X POST -H "Content-Type: application/json" -H "accept: */*" -d "{\"key\": \"$LICENSE\", \"host_name\": \"$HOSTNAME\"}" "$CLN_REGISTER_SERVER")
CLN_CODE=$(head -n1 <<< "$CLN_REGISTER")

if [[ ! "$CLN_CODE" == *"200"* ]]; then
    echo "Got incorrect status from CLN: $CLN_REGISTER"
    exit 1
fi

TOKEN=$(echo "$CLN_REGISTER" | grep -oP '"token":"\K[\w\d-]*')

if [[ -z $TOKEN ]]; then
    echo "Something went wrong. Token is not defined"
    exit 1
fi

if ! echo "${TOKEN}" > "$AUTH_CONF_PATH"; then
    echo "Error: Could not write to $AUTH_CONF_PATH"
    exit 10
fi

if ! install_els_os_release; then
    exit 14
fi

yum clean all
if ! yum install -y els-define --disablerepo=* --enablerepo=centos7-els; then
    echo "Error: Couldn't install els-define"
    exit 1
fi

echo "CentOS 7 ELS installed successfully"

