#!/usr/bin/env bash

set -o errexit
set -o nounset
set -o pipefail

# Uncomment to enable debug
#set -o xtrace

PATH=${PATH:-}:/usr/bin/:/bin:/usr/sbin:/sbin
PACKAGE_NAME="${PACKAGE_NAME:-ipu_driver}"
PACKAGE_VERSION="${PACKAGE_VERSION:-1.0}"

# needed to make nounset work with gc-drivers dkms module
[[ ! -z ${kernelver:-} ]] || kernelver=$(uname -r)

# utility functions
INFO() {
        /bin/echo -e "\e[104m\e[97m[INFO]\e[49m\e[39m $*"
}

WARNING() {
        /bin/echo >&2 -e "\e[101m\e[97m[WARNING]\e[49m\e[39m $*"
}

ERROR() {
        /bin/echo >&2 -e "\e[101m\e[97m[ERROR]\e[49m\e[39m $*"
	exit 1
}

# START

if [ "${EUID:-999}" -ne 0 ]; then
  ERROR "Please run as root, or user with cached sudo privileges"
fi

# extract version from dkms version
[[ -f ./dkms.conf ]] && source ./dkms.conf

# check if driver is loaded
[[ -f /sys/bus/pci/drivers/ipu/module/version ]] && ERROR "${PACKAGE_NAME} loaded, please unload before running ${0##*/}."

# install driver
install -m 644 udev/* /etc/udev/rules.d/                 || ERROR "Failed to install udev rules from ${PWD:-}/udev to /etc/udev/rules.d"
[[ ! -d /usr/src/"${PACKAGE_NAME}-${PACKAGE_VERSION}" ]]                        && mkdir -p /usr/src/"${PACKAGE_NAME}-${PACKAGE_VERSION}"
cp -f ./*.{c,h} Makefile dkms.conf /usr/src/"${PACKAGE_NAME}-${PACKAGE_VERSION}" || ERROR "Failed to install source into /usr/src/${PACKAGE_NAME}-${PACKAGE_VERSION}"
dkms add -m "${PACKAGE_NAME}" -v "${PACKAGE_VERSION}"             || WARNING "Failed to dkms add ${PACKAGE_NAME} -v ${PACKAGE_VERSION}"
INFO "$(dkms build   -m "${PACKAGE_NAME}" -v "${PACKAGE_VERSION}")" || ERROR   "Failed to dkms build ${PACKAGE_NAME} -v ${PACKAGE_VERSION}" 
INFO "$(dkms install -m "${PACKAGE_NAME}" -v "${PACKAGE_VERSION}")" || ERROR   "Failed to install ${PACKAGE_NAME} -v ${PACKAGE_VERSION}"
modprobe "${PACKAGE_NAME}"                                || WARNING "Failed to add built ${PACKAGE_NAME} (${PACKAGE_VERSION}) to running kernel"

# Check installation
[[ -f /sys/bus/pci/drivers/ipu/module/version ]]        && _kernel_ipu_driver="$(cat /sys/bus/pci/drivers/ipu/module/version)"
[[ ! ${PACKAGE_VERSION:-} =~ ${_kernel_ipu_driver=:-} ]]        && ERROR "Running IPU driver version ${_kernel_ipu_driver:-unknown}, package version: ${PACKAGE_VERSION}"
[ 0 -eq "$(find /dev -maxdepth 1 -type c -regex "^/dev/ipu[0-9]+$" | wc -l)" ] && WARNING "No supported IPU devices have been found"

exit 0
# Fin
