#!/bin/sh -e
#** -LICENSE-START-
#** Copyright (c) 2019 Blackmagic Design
#**
#** Permission is hereby granted, free of charge, to any person or organization
#** obtaining a copy of the software and accompanying documentation covered by
#** this license (the "Software") to use, reproduce, display, distribute,
#** execute, and transmit the Software, and to prepare derivative works of the
#** Software, and to permit third-parties to whom the Software is furnished to
#** do so, all subject to the following:
#**
#** The copyright notices in the Software and this entire statement, including
#** the above license grant, this restriction and the following disclaimer,
#** must be included in all copies of the Software, in whole or in part, and
#** all derivative works of the Software, unless such copies or derivative
#** works are solely in the form of machine-executable object code generated by
#** a source language processor.
#**
#** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
#** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
#** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
#** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
#** DEALINGS IN THE SOFTWARE.
#** -LICENSE-END-  

STEP=$1
DRIVER_MODULE=$2
DRIVER_VERSION=$3

log_msg()
{
	echo "* $1"
}

log_err()
{
	echo "ERR $1" 1>&2
}

load_modules()
{
	# Reload module if we're called for the running kernel
	if [ -z "${kernelver}" -o "`uname -r`" = "${kernelver}" ]; then
		# Need to run depmod here, because the post install script is run before dkms
		# runs depmod
		depmod -a ${kernelver}

		local DRIVER_MODULE_UNDERSCORE=$(echo "${DRIVER_MODULE}" | sed 's/-/_/g')

		local MODULE_USE=$(lsmod | grep "${DRIVER_MODULE_UNDERSCORE} " | sed -n 's/^.*\([0-9][0-9]*\)[ \t]*$/\1/p')
		if [ -n "${MODULE_USE}" ]; then
			log_msg "Driver was already loaded, attempting to reload"

			if [ "${MODULE_USE}" -ne 0 ]; then
				log_err "The driver was not able to be unloaded because it is in use"
				log_err "You will need to reboot to use the new driver"
				exit 0
			fi

			if ! modprobe -r ${DRIVER_MODULE}; then
				log_err "The existing ${DRIVER_MODULE} driver was not able to be unloaded"
				log_err "Please check 'dmesg' for more information"
				exit 0
			fi
		else
			log_msg "Attempting to load driver"
		fi

		if ! modprobe ${DRIVER_MODULE}; then
			log_err "The new ${DRIVER_MODULE} driver was not able to be loaded"
			log_err "Please check 'dmesg' for more information"
		fi
	fi
}

sign_modules()
{
	[ -n "$BMD_NO_SECUREBOOT" ] && exit 0

	# If secureboot is not enabled, don't sign the drivers
	local SECUREBOOT_EFIVAR=$(ls -1 /sys/firmware/efi/efivars/SecureBoot-* 2> /dev/null)
	[ -z "${SECUREBOOT_EFIVAR}" ] && exit 0
	[ "$(od -An -t u1 ${SECUREBOOT_EFIVAR} | rev | cut -d ' ' -f 1)" = "1" ] || exit 0

	# If update-secureboot-policy exists dkms should take care of signing without our help
	[ -x "$(which update-secureboot-policy 2> /dev/null)" ] && exit 0

	SIGN_TOOL=/lib/modules/${kernelver}/build/scripts/sign-file
	[ -x "$(which kmodsign 2> /dev/null)" ] && SIGN_TOOL=kmodsign

	for MODULE in $(find ../${kernelver} -name "*.ko*"); do
		if [ -n "$(echo ${MODULE} | grep '.*\.ko\.xz$')" ]; then
			DECOMPRESS_CMD="xz -d"
			COMPRESS_CMD=xz
			MODULE_BASE=$(echo ${MODULE} | rev | cut -f 2- -d . | rev)
		elif [ -n "$(echo ${MODULE} | grep '.*\.ko\.gz$')" ]; then
			DECOMPRESS_CMD="gzip -d"
			COMPRESS_CMD=gzip
			MODULE_BASE=$(echo ${MODULE} | rev | cut -f 2- -d . | rev)
		elif [ -n "$(echo ${MODULE} | grep '.*\.ko$')" ]; then
			MODULE_BASE=${MODULE}
		else
			continue
		fi

		log_msg "Signing driver"
		[ -n "${DECOMPRESS_CMD}" ] && ${DECOMPRESS_CMD} ${MODULE}
		${SIGN_TOOL} sha256 /var/lib/blackmagic/MOK.priv /var/lib/blackmagic/MOK.der ${MODULE_BASE} ${MODULE_BASE}
		[ -n "${COMPRESS_CMD}" ] && ${COMPRESS_CMD} ${MODULE_BASE}
	done
}

case ${STEP} in
	post-build)
		if [ -n "${SKIP_DKMS_POST_BUILD}" ]; then
			exit 0
		fi
		sign_modules
		;;

	post-install)
		if [ -n "${SKIP_DKMS_POST_INSTALL}" ]; then
			exit 0
		fi
		load_modules
		;;

	*)
		exit 1
		;;
esac

exit 0
