#!/bin/bash

VNLK=/usr/bin/vnlk
YUM=/usr/bin/yum
APT=/usr/bin/apt
YUM_CFG_MGR=/usr/bin/yum-config-manager
VAR=/var/vnlk/update
PREV_SETTINGS=$VAR/settings.json
CENTOS=0
UBUNTU=0
UBUNTU_MIRROR_URL=''

if [ -f $VAR/.disabled ]; then
    logger -p local0.notice -t update-vnlk "Updates disabled"
    exit 0
fi

function prepare {
    # Get OS
    if grep -q "Ubuntu" /etc/os-release; then
        UBUNTU=1
    elif grep -q "CentOS" /etc/os-release; then
        CENTOS=1
    fi
    # Do nothing if we aren't running on neither Centos nor Ubuntu
    if [[ $CENTOS -eq 0 && $UBUNTU -eq 0 ]]; then exit 0; fi
    # Disable all repos first (Centos)
    if [ $CENTOS -eq 1 ]; then
        $YUM_CFG_MGR --disable \* &>/dev/null
    fi
}

function get-updates-url {
    # Get endpoint from Link confniguration
    SETTINGS="$(timeout -k 31 30 $VNLK -rx 'cloud http call api-php/api/call/getAvatarGlobalSettings' 2>/dev/null)"
    UPDATES_HOST="$(echo $SETTINGS | jq -r .list?.UPDATES_HOST?)"
    if [ -z "$UPDATES_HOST" ] || [ "$UPDATES_HOST" == "null" ]; then
        logger -p local0.error -t update-vnlk "Cannot get link update configuration"
        echo "Cannot get link update configuration"
        if [ -f "$PREV_SETTINGS" ]; then
            SETTINGS="$(cat $PREV_SETTINGS)"
            UPDATES_HOST="$(echo $SETTINGS | jq -r .list?.UPDATES_HOST?)"
            [ -z "$UPDATES_HOST" ] || [ "$UPDATES_HOST" == "null" ] && exit 1
            echo "Using previous saved configuration"
            logger -p local0.notice -t update-vnlk "Using previous saved configuration"
        else
            exit 1
        fi
    else
        echo "$SETTINGS" > $PREV_SETTINGS
    fi

    # Get update repo URL
    UPDATES_PROTO=$(echo $SETTINGS | jq -r .list?.UPDATES_PROTO?)
    [ -z "$UPDATES_PROTO" ] || [ "$UPDATES_PROTO" == "null" ] && UPDATES_PROTO=https
    UPDATES_HOST="$(echo $SETTINGS | jq -r .list?.UPDATES_HOST?)" # FIXME: superfluous?
    if [ -z "$UPDATES_HOST" ] || [ "$UPDATES_HOST" == "null" ]; then
        logger -p local0.error -t update-vnlk "Cannot get updates host"
        echo "Cannot get updates host"
        exit 2
    fi

    # Get Ubuntu mirror URL if defined
    if [ $UBUNTU -eq 1 ]; then
        UBUNTU_MIRROR_URL=$(echo $SETTINGS | jq -r .list?.UBUNTU_MIRROR_URL?)
        [ -z "$UBUNTU_MIRROR_URL" ] || [ "$UBUNTU_MIRROR_URL" == "null" ] && UBUNTU_MIRROR_URL=''
        [[ $UBUNTU_MIRROR_URL =~ ^/ ]] && UBUNTU_MIRROR_URL=$UPDATES_PROTO://$UPDATES_HOST$UBUNTU_MIRROR_URL
    fi

    UPDATES_URL=$UPDATES_PROTO://$UPDATES_HOST
}

function create-update-config-centos {
    cp -f /etc/yum.conf $VAR
    echo "reposdir=$VAR" >> $VAR/yum.conf

    cat << EOF > $VAR/vnlk.repo
[vnlk-os]
name=vnlk-os
baseurl=$UPDATES_URL/centos/7/os/x86_64
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

[vnlk-updates]
name=updates
baseurl=$UPDATES_URL/centos/7/updates/x86_64
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

[vnlk-extras]
name=extras
baseurl=$UPDATES_URL/centos/7/extras/x86_64
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

[vnlk-epel]
name=epel
baseurl=$UPDATES_URL/centos/7/epel/x86_64
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

[vnlk-elrepo-kernel]
name=elrepo-kernel
baseurl=$UPDATES_URL/centos/7/elrepo-kernel/x86_64
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-elrepo.org

[vnlk-vnextras]
name=vnextras
baseurl=$UPDATES_URL/centos/7/vnextras
gpgcheck=0
enabled=1
EOF
}

function create-update-config-ubuntu {
    # Add entry for Jetstream Link repo
    echo "deb [trusted=yes] $UPDATES_URL/ubuntu stable main" | tee /etc/apt/sources.list.d/vnlk.list

    # If UBUNTU_MIRROR_URL is configured for the cluster - replace entire original sources.list
    if [ -n "$UBUNTU_MIRROR_URL" ]; then
        if [ ! -f $VAR/sources.list.orig ]; then
            cp /etc/apt/sources.list $VAR/sources.list.orig
        fi
        cat << EOF > /etc/apt/sources.list
deb $UBUNTU_MIRROR_URL focal main restricted universe multiverse
deb $UBUNTU_MIRROR_URL focal-security main restricted universe multiverse
deb $UBUNTU_MIRROR_URL focal-updates main restricted universe multiverse
EOF
    fi
}

function create-update-config {
    mkdir -p $VAR

    if [ $UBUNTU -eq 1 ]; then
        create-update-config-ubuntu
    elif [ $CENTOS -eq 1 ]; then
        create-update-config-centos
    fi
}

function update-centos {
    # Finally update packages
    $YUM -c $VAR/yum.conf -y clean all
    $YUM -c $VAR/yum.conf -y -d 0 -e 0 update yum
    $YUM -c $VAR/yum.conf -y -e 0 -d 0 update
}

function update-ubuntu {
    export DEBIAN_FRONTEND=noninteractive
    dpkg --configure -a
    apt-get update -y
    apt-get --only-upgrade install videonext-link -y
    apt-get --only-upgrade install ds-vmx -y
    local REBOOT=0
    if [ -n "$UBUNTU_MIRROR_URL" ]; then
        # install ds-vmx and nvidia-driver if not already installed
        [ -z "$(dpkg --get-selections | grep -w ds-vmx | grep -w install)" ] && apt-get install --no-install-recommends -y ds-vmx
        local NVIDIA_DRV_VER=`dpkg --get-selections | grep -w "install" | awk 'match($0,/^nvidia-driver-([[:digit:]]+)/,m) {print m[1]}' | sort -V | tail -1`
        local NVIDIA_DRV_VER_POST=""
        if [ -z "$NVIDIA_DRV_VER" ]; then
            # TODO: might be worth to use 'ubuntu-drivers' tool to install recommended driver's version
            apt-get install --no-install-recommends -y libnvidia-compute-515 # will remove interfere packages from previous versions if any
            apt-get install --no-install-recommends -y nvidia-driver-515
            NVIDIA_DRV_VER_POST=`dpkg --get-selections | grep -w "install" | awk 'match($0,/^nvidia-driver-([[:digit:]]+)/,m) {print m[1]}' | sort -V | tail -1`
        fi
        #local NVIDIA_HEADLESS_VER=`dpkg --get-selections | grep -w "install" | awk 'match($0,/^nvidia-headless-no-dkms-([[:digit:]]+)/,m) {printf "%d\n", m[1]}' | sort -V | tail -1`
        #[ -z "$NVIDIA_HEADLESS_VER" ] && apt-get install --no-install-recommends -y nvidia-headless-no-dkms-515
        apt-get upgrade -y
        if [ -n "$NVIDIA_DRV_VER_POST" ]; then
            echo blacklist nouveau > /etc/modprobe.d/blacklist-nvidia-nouveau.conf
            echo options nouveau modeset=0 >> /etc/modprobe.d/blacklist-nvidia-nouveau.conf
            systemctl --no-reload disable gdm  >/dev/null 2>&1
            systemctl --no-reload disable gdm3 >/dev/null 2>&1
            REBOOT=1
        fi
    fi
    apt-get clean
    if [ $REBOOT -eq 1 ]; then
        touch /var/vnlk/.reboot
        chown apl:apl /var/vnlk/.reboot
    fi
}

function update {
    logger -p local0.notice -t update-vnlk "Updating Link packages..."

    if [ $UBUNTU -eq 1 ]; then
        update-ubuntu
    elif [ $CENTOS -eq 1 ]; then
        update-centos
    fi
}

function main {
    prepare

    get-updates-url

    create-update-config

    update
}

main
