#!/bin/bash
#
# Register system to RHN
# Source functions library
. /etc/init.d/functions
. /usr/libexec/ovirt-functions

trap '__st=$?; stop_log; exit $__st' 0
trap 'exit $?' 1 2 13 15

warn() { printf '%s\n' "$*" >&2; }

check() {
if ! is_local_storage_configured; then
    warn "Configure local storage before registering to RHN."
    exit 99
fi
if ! network_up; then
    warn "Configure network before registering to RHN."
    exit 99
fi
}

# Usage: rhnreg_ks ARGS
# $1 - serverUrl
# $2 - CaCert
# $3 - activationkey
# $4 - username
# $5 - password
# $6 - profilename
function run_rhnreg {

    local serverUrl=$1
    local CaCert=$2
    local activationkey=$3
    local userName=$4
    local passWord=$5
    local profileName=$6
    local proxyuser=$7
    local proxypass=$8
    local proxyhost=$9

    # have to run with novirtinfo b/c vdsm is not running before
    # rhevm registration
    # after reboot, rhn-virtualization daemon should refresh virtinfo
    extra_args="--novirtinfo --norhnsd --nopackages --force"
    args=""

    # Get CaCert location
    if [ -n "$serverUrl" ]; then
        args="$args --serverUrl $serverUrl/XMLRPC"
        if [ -z "$CaCert" ]; then
            CaCert="$serverUrl/pub/RHN-ORG-TRUSTED-SSL-CERT"
        fi
        cert=$(echo $CaCert | awk -F/ '{print $NF}')
        location="/etc/sysconfig/rhn/$cert"
        log "Downloading Satellite CA cert....."
        log "From: $CaCert To: $location"
        wget -q -r -nd --no-check-certificate --timeout=30 --tries=3 -O "$location" "$CaCert"
        if [ -s "${location}" ]; then
            args="${args} --sslCACert $location"
            ovirt_store_config $location
        else
            log "Error Downloading Satellite CA cert!"
            return 1
        fi
    else
        serverUrl="https://xmlrpc.rhn.redhat.com/XMLRPC"
        location="/usr/share/rhn/RHNS-CA-CERT"
        args="${args} --serverUrl $serverUrl --sslCACert $location"
    fi

    if [ -n "$activationkey" ]; then
        args="${args} --activationkey $activationkey"
    elif [ -n "$userName" ]; then
        args="${args} --username $userName"
        if [ -n "$passWord" ]; then
            args="${args} --password $passWord"
        fi
    else
        # skip RHN registration when neither activationkey
        # nor username/password is supplied
        # return success for AUTO w/o rhn_* parameters
        return 0
    fi

    if [ -n "$profileName" ]; then
        args="${args} --profilename $profileName"
    fi

    if [ -n "$proxyhost" ]; then
        args="${args} --proxy=$proxyhost"
        if [ -n "$proxyuser" ]; then
            args="${args} --proxyUser=$proxyuser"
            if [ -n "$proxypass" ]; then
                args="${args} --proxyPassword=$proxypass"
            fi
        fi
    fi

    if [ -n "$extra_args" ]; then
        args="${args} $extra_args"
    fi

    log "Registering to RHN account....."

    unmount_config /etc/sysconfig/rhn/systemid
    unmount_config /etc/sysconfig/rhn/up2date
    # regenerate up2date config
    rm -rf /etc/sysconfig/rhn/up2date
    if rhnreg_ks $args; then
        ovirt_store_config \
            /etc/sysconfig/rhn/up2date \
            /etc/sysconfig/rhn/systemid
        log "System "$profileName" sucessfuly registered "$serverUrl""
        return 0
    else
        log "Error registering to RHN account!"
        return 1
    fi
}

function run_rhsm {

    local serverUrl=$1
    local CaCert=$2
    local activationkey=$3
    local userName=$4
    local passWord=$5
    local profileName=$6
    local proxyuser=$7
    local proxypass=$8
    local proxyhost=$9

    extra_args="--force --autosubscribe"
    args=""

    if [ -n "$activationkey" ]; then
        args="${args} --activationkey=$activationkey"
    elif [ -n "$userName" ]; then
        args="${args} --username=$userName"
        if [ -n "$passWord" ]; then
            args="${args} --password=$passWord"
        fi
    else
        # skip RHSM registration when neither activationkey
        # nor username/password is supplied
        # return success for AUTO w/o rhn_* parameters
        return 0
    fi

    if [ -n "$serverUrl" ]; then
        eval $(serverUrl=$serverUrl python -c "
import os
u=os.getenv('serverUrl')
if u.count('://') == 1:
    (proto, u) = u.split('://')
else:
    proto = ''
if u.count(':') == 1:
    (u, port) = u.split(':')
elif proto == 'http':
    port = 80
elif proto == 'https':
    port = 443
else:
    port = 0
host = u.split('/')[0]
print 'host=%s' % host
print 'port=%s' % port
")
        if [ -z "$port" -o "$port" == "0" ]; then
            port=443
        fi
        cert=$(echo $CaCert | awk -F/ '{print $NF}')
        location="/etc/rhsm/ca/$cert"
        log "Downloading CA cert....."
        log "From: $CaCert To: $location"
        wget -r -nd --no-check-certificate --timeout=30 --tries=3 -O "$location" "$CaCert"
        if [ -s "${location}" ]; then
            subscription-manager config --rhsm.repo_ca_cert $location
            ovirt_store_config $location
        else
            log "Error Downloading Satellite CA cert!"
            return 1
        fi
    else
        host="subscription.rhn.redhat.com"
        port="443"
    fi
    if subscription-manager config --server.hostname=$host --server.port=$port; then
        ovirt_store_config /etc/rhsm/rhsm.conf
    fi

    if [ -n "$profileName" ]; then
        args="${args} --name=$profileName"
    fi

    if [ -n "$proxyhost" ]; then
        args="${args} --proxy=$proxyhost"
        if [ -n "$proxyuser" ]; then
            args="${args} --proxyuser=$proxyuser"
            if [ -n "$proxypass" ]; then
                args="${args} --proxypassword=$proxypass"
            fi
        fi
    fi

    if [ -n "$extra_args" ]; then
        args="${args} $extra_args"
    fi

    log "Registering to RHN account....."

    unmount_config /etc/pki/consumer/*pem
    unmount_config /var/lib/rhsm/productid.js /var/lib/rhsm/cache/installed_products.json /var/lib/rhsm/facts/facts.json
    rm -rf /var/lib/rhsm/productid.js /var/lib/rhsm/cache/installed_products.json /var/lib/rhsm/facts/facts.json
    args="subscription-manager register ${args}"
    # cant rely on return code in RHEVH's case
    eval $args
    subscription-manager identity $>/dev/null
    rc=$?
    if [ $rc -eq 0 ]; then
        ovirt_store_config \
            /etc/pki/consumer/*pem \
            /var/lib/rhsm/productid.js \
            /var/lib/rhsm/cache/installed_products.json \
            /var/lib/rhsm/facts/facts.json
        log "System "$profileName" successfully registered "$serverUrl""
        return 0
    else
        log "Error registering to RHN account!"
        return 1
    fi
}

# Prompts the user for a single username, password combo
function prompt_user {
        servertype="$1"
        serverurl=""
        cacert=""
        username=""
        password=""
        profilename=""
        proxyhost=""
        proxyuser=""
        proxypass=""

        if [ "$servertype" = "SAT" ]; then
            printf "\n"
            read -p "Enter URL of RHN Satellite (ie. https://satellite.example.com): " -er
            test -z "$REPLY" && return 1
            serverurl=$REPLY

            default=$serverurl/pub/RHN-ORG-TRUSTED-SSL-CERT
            printf "\n"
            read -p "Enter location of satellite cert ($default): " -er
            #test -z "$REPLY" && REPLY=$default
            cacert=$REPLY
        elif [ "$servertype" = "SAM" ]; then
            printf "\n"
            read -p "Enter URL of Subscription Asset Manager (ie. https://subscription.rhn.redhat.com): " -er
            serverurl=$REPLY
            if [ -n "$serverurl" ]; then
                default=$serverurl/pub/RHN-ORG-TRUSTED-SSL-CERT
                printf "\n"
                read -p "Enter location of Subscription Asset Manager Cert ($default): " -er
                cacert=$REPLY
            fi
        fi

        printf "\n"
        read -p "Enter RHN account username: " -er
        test -z "$REPLY" && return 1
        username=$REPLY


        printf "\n"
        read -p "Enter password for RHN account: " -esr
        test -z "$REPLY" && return 1
        password=$REPLY


        printf "\n"
        read -p "Enter profile name for this system (optional): " -er
        profilename=$REPLY

        printf "\n"
        read -p "Enter HTTP proxy in host:port format, e.g. proxy.example.com:3128 (leave blank if not required): " -er
        if [ -n "$REPLY" ]; then
            proxyhost=$REPLY

            printf "\n"
            read -p "Enter proxy username (leave blank if not required): " -er
            proxyuser=$REPLY

            printf "\n"
            read -p "Enter proxy password (leave blank if not required): " -esr
            proxypass=$REPLY
        fi

        if [ "$servertype" = "SAM" ]; then
            run_rhsm "$serverurl" "$cacert" "" "$username" "$password" "$profilename" "$proxyuser" "$proxypass" "$proxyhost"
        else
            run_rhnreg "$serverurl" "$cacert" "" "$username" "$password" "$profilename" "$proxyuser" "$proxypass" "$proxyhost"
        fi
}

HOSTED="Register to public RHN"
SATELLITE="Register to RHN Satellite"
SAM="Register to Subscription Asset Manager"
QUIT="Return to the Hypervisor Configuration Menu"

if [ "$1" = "AUTO" ]; then
    if [ "$OVIRT_RHN_TYPE" = "sam" ]; then
        run_rhsm "${OVIRT_RHN_URL}" "${OVIRT_RHN_CA_CERT}" "${OVIRT_RHN_ACTIVATIONKEY}" "${OVIRT_RHN_USERNAME}" "${OVIRT_RHN_PASSWORD}" "${OVIRT_RHN_PROFILE}" "${OVIRT_RHN_PROXY}" "${OVIRT_RHN_PROXYUSER}" "${OVIRT_RHN_PROXYPASSWORD}"
    else
        run_rhnreg "${OVIRT_RHN_URL}" "${OVIRT_RHN_CA_CERT}" "${OVIRT_RHN_ACTIVATIONKEY}" "${OVIRT_RHN_USERNAME}" "${OVIRT_RHN_PASSWORD}" "${OVIRT_RHN_PROFILE}" "${OVIRT_RHN_PROXY}" "${OVIRT_RHN_PROXYUSER}" "${OVIRT_RHN_PROXYPASSWORD}"
    fi
    exit $?
else
    check
    while true; do
        PS3="Choose an option: "
        select option in "$HOSTED" "$SATELLITE" "$SAM" "$QUIT"
          do

          case $option in
              $HOSTED) prompt_user; break;;
              $SATELLITE) prompt_user "SAT"; break;;
              $SAM) prompt_user "SAM"; break;;
              $QUIT) exit;;
          esac
        done

        printf "\n"
    done
fi
