#!/bin/sh

# Get the system serial number (ie: chassis, or baseboard, this depends on vendor...)
# and display it on the console. Cache the result to /etc/oci/system-serial
# to avoid expensive calls to dmidecode.

set -e

if [ -r /etc/oci/system-serial ] ; then
	SYSTEM_SERIAL=$(cat /etc/oci/system-serial)
else
	SYSTEM_MANUFACTURER=$(dmidecode -s system-manufacturer)

	case $SYSTEM_MANUFACTURER in
		"HPE"|"Dell"|"Dell Inc."|"Acer"|"LinuxKVM"|"OpenStack Nova"|"GIGABYTE")
			SYSTEM_SERIAL=$(dmidecode -s system-serial-number)
		;;
		"Lenovo"|"LENOVO")
			SYSTEM_SERIAL=$(dmidecode -s chassis-serial-number)
		;;
		# Supermicro is stupid, dmidecode -s system-serial-number
		# will always return 1234567890
		"Supermicro")
			SYSTEM_SERIAL=$(dmidecode -s baseboard-serial-number)
		;;
		# Fallback for all other (possibly broken?) motherboards.
		# Please contribute as you see issues.
		*)
			SYSTEM_SERIAL=$(dmidecode -s baseboard-serial-number)
			if [ -z "${SYSTEM_SERIAL}" ] ; then
				SYSTEM_SERIAL=$(dmidecode -s system-serial-number)
			fi
		;;
	esac

fi

echo ${SYSTEM_SERIAL} > /etc/oci/system-serial
echo ${SYSTEM_SERIAL}

exit 0

