#!/bin/sh
# description "checks the version/config of the kernel"
# author "Scaleway <opensource@scaleway.com>"
set -eu

CONFIG_FILE=/etc/scw-kernel-check.conf

warn_expect_kernel() {
	echo "Warning: this image expects a Linux kernel $*;" \
		"consider using another scaleway bootscript." \
		| tee /dev/stderr /dev/console
}

warn_version() {
	warn_expect_kernel \
		">= $EXPECT_MAJOR_MIN.${EXPECT_MINOR_MIN:-0}" \
		"(you are using $KERNEL_VERSION)"
}

warn_config() {
	warn_expect_kernel "with $1"
}

check_version() {
	[ "${EXPECT_MAJOR_MIN+}" ] || return 0
	[ "$MAJOR" -gt "$EXPECT_MAJOR_MIN" ] && return 0
	[ "$MAJOR" -lt "$EXPECT_MAJOR_MIN" ] && return 1

	[ "${EXPECT_MINOR_MIN+}" ] || return 0
	[ "$MINOR" -gt "$EXPECT_MINOR_MIN" ] && return 0
	[ "$MINOR" -lt "$EXPECT_MINOR_MIN" ] && return 1

	return 0
}

expect_config() {
	if [ "$EXPECT_VALUE" = y ]; then
		zcat /proc/config.gz | grep -q "^$EXPECT_CONF=y" || return 1
	elif [ "$EXPECT_VALUE" = n ]; then
		zcat /proc/config.gz | grep -q "^$EXPECT_CONF=[ym]" && return 1
	fi
	return 0
}

[ -f "$CONFIG_FILE" ] || exit 0
. "$CONFIG_FILE"

FAILED=0

# check if the current kernel version is >= to the expected one
KERNEL_VERSION=$(uname -r)
# extract number before first dot
MAJOR=${KERNEL_VERSION%%.*}
# two-step substitution to extract second number between dots
MINOR=${KERNEL_VERSION#.*}
MINOR=${MINOR%%.*}

if ! check_version; then
	warn_version
	FAILED=1
fi

# check any additional required configs
for EXPECT_CONFIG in $(set | grep '^EXPECT_CONFIG_'); do
	EXPECT_LINE=${EXPECT_CONFIG#EXPECT_}
	EXPECT_CONF=${EXPECT_LINE%%=*}
	eval "EXPECT_VALUE=\${EXPECT_$EXPECT_CONF}"

	if ! expect_config; then
		warn_config "$EXPECT_LINE"
		FAILED=1
	fi
done

exit "$FAILED"
