#!/bin/bash
#
# version_check.sh     Version check and phone-home script for Puppet Enterprise
#
if [ -e /etc/puppetlabs/puppetserver/opt-out ]; then
    q_pe_check_for_updates="n"
elif [ -f /etc/puppetlabs/installer/answers.install ]; then
    . /etc/puppetlabs/installer/answers.install
fi

version_check() {
    if [ ! -f "/opt/puppetlabs/server/pe_version" -o ! -e "/opt/puppetlabs/bin/facter" ] ; then
        return
    fi
    agent_version=`cat /opt/puppetlabs/server/pe_version`
    product_name='pe-master'
    license_file=/etc/puppetlabs/license.key
    cert="$(/opt/puppetlabs/bin/puppet master --configprint hostcert)"
    cacert="$(/opt/puppetlabs/bin/puppet master --configprint localcacert)"
    key="$(/opt/puppetlabs/bin/puppet master --configprint hostprivkey)"

    if [ ! -e "${license_file}" ]; then
        licenses='10'
        uuid=''
    else
        licenses=$(awk '/nodes/ { print $2 }' ${license_file})
        uuid=$(awk '/uuid/ { print $2 }' ${license_file})
    fi
    puppetdb_server_urls="$(awk '/server_urls/ { print $3 }' /etc/puppetlabs/puppet/puppetdb.conf | tr ',' "\n")"
    nodes=0
    for puppetdb_server_url in $puppetdb_server_urls ; do
        result="$(curl --silent --location --cert "${cert}" --cacert "${cacert}" --key "${key}" \
                  "${puppetdb_server_url}/metrics/v1/mbeans/puppetlabs.puppetdb.query.population:type=default,name=num-nodes" | grep "Value" )"
        if [ $? -ne 0 ] ; then
          continue
        else
          nodes="$(echo "${result}" | awk '{print $3}' | tr -d ',')"
        fi
    done
    os=`/opt/puppetlabs/bin/facter operatingsystem operatingsystemrelease | awk -F'=>' '{gsub(/ /, "", $NF); printf $NF; printf "%%20"; getline; gsub(/ /, "", $NF); print $NF}'`
    host="${q_version_check_host:-"updates.puppetlabs.com"}"
    port="${q_version_check_port:-"80"}"
    format='txt'
    URL="http://${host}:${port}/?product=${product_name}&version=${agent_version}&os=${os}&nodes=${nodes}&licenses=${licenses:-'10'}&format=${format}&uuid=${uuid}"
    unset -v response i

    while IFS= read -r; do
        response[i++]=$REPLY
    done < <( curl --connect-timeout 10 --silent "${URL}")
    [[ $REPLY ]] && response[i++]=$REPLY

    if [[ "${response[@]}"  =~ newer=true ]] ; then
        for n in ${!response[@]}; do
            line=${response[$n]}
            if [[ $line =~ message= ]] ; then
                message=${line/*message=/}
                continue
            fi
            if [[ $line =~ link= ]] ;  then
                link=${line/link=/}
                continue
            fi
        done
        if [ -n "${message}" -a -n "${link}" ]; then
            message="${message} (currently ${agent_version})."
            echo "${message}"
            echo "${link}"
            logger -t puppetserver "${message}"
            logger -t puppetserver "${link}"
        else
            echo "There's a newer version of Puppet Enterprise available, but there was an internal problem."
        fi
    fi
}

if [ -z "$q_pe_check_for_updates" -o "${q_pe_check_for_updates}" != "n" ] && [ -f /etc/puppetlabs/puppet/puppetdb.conf ]; then
    version_check
fi
exit 0
