#!/bin/bash
KERNEL_VERSION=`uname -r`
INSTALL_PATH="/boot/"

if [ ! -f /quadstor/lib/modules/$KERNEL_VERSION/qla2xxx.ko ]; then
	echo "qla2xxx driver has not been built for kernel version $KERNEL_VERSION"
	echo "Build the itf package by running /quadstor/bin/builditf first"
	exit 1
fi

/sbin/modprobe -q qla2xxx

copy_driver() {
	dirpath=$1

	if [ ! -d $dirpath ]; then
		echo "$dirpath does not exist. Nothing to be done"
		return
	fi

	doxz=0
	dozst=0
	if [ -f $dirpath/qla2xxx.ko.zst.qssave ]; then
		echo "Already saved original $dirpath/qla2xxx.ko.zst driver"
		dozst=1
	elif [ -f $dirpath/qla2xxx.ko.xz.qssave ]; then
		echo "Already saved original $dirpath/qla2xxx.ko.xz driver"
		doxz=1
	elif [ -f $dirpath/qla2xxx.ko.qssave ]; then
		echo "Already saved original $dirpath/qla2xxx.ko driver"
	elif [ -f $dirpath/qla2xxx.ko.zst ]; then
		mv -f $dirpath/qla2xxx.ko.zst $dirpath/qla2xxx.ko.zst.qssave > /dev/null 2>&1
		dozst=1
	elif [ -f $dirpath/qla2xxx.ko.xz ]; then
		echo "Moving original $dirpath/qla2xxx.ko.xz driver to $dirpath/qla2xxx.ko.xz.qssave"
		mv -f $dirpath/qla2xxx.ko.xz $dirpath/qla2xxx.ko.xz.qssave > /dev/null 2>&1
		doxz=1
	elif [ -f $dirpath/qla2xxx.ko ]; then
		echo "Moving original $dirpath/qla2xxx driver to $dirpathqla2xxx.ko.qssave"
		mv -f $dirpath/qla2xxx.ko $dirpath/qla2xxx.ko.qssave > /dev/null 2>&1
	fi

	unlink $dirpath/qla2xxx.ko > /dev/null 2>&1
	unlink $dirpath/qla2xxx.ko.xz > /dev/null 2>&1
	unlink $dirpath/qla2xxx.ko.zst > /dev/null 2>&1
	cp -f /quadstor/lib/modules/$KERNEL_VERSION/qla2xxx.ko $dirpath/qla2xxx.ko
	chmod 744 $dirpath/qla2xxx.ko
	if [ $dozst -eq 1 ]; then
		zstd -z $dirpath/qla2xxx.ko 
		chmod 744 $dirpath/qla2xxx.ko.zst
	elif [ $doxz -eq 1 ]; then
		xz -C crc32 -z $dirpath/qla2xxx.ko
		chmod 744 $dirpath/qla2xxx.ko.xz
	fi
}

copy_driver /lib/modules/$KERNEL_VERSION/kernel/drivers/scsi/qla2xxx
copy_driver /lib/modules/$KERNEL_VERSION/kernel/extra/qla2xxx

#Copy to updates also
mkdir -p /lib/modules/$KERNEL_VERSION/updates/virt
rm -f /lib/modules/$KERNEL_VERSION/updates/virt/qla2xxx.ko.*

modulesbase="/lib/modules/$KERNEL_VERSION/"
if [ -f ${modulesbase}/kernel/drivers/scsi/qla2xxx/qla2xxx.ko.xz ]; then
	cp -f ${modulesbase}/kernel/drivers/scsi/qla2xxx/qla2xxx.ko.xz "$modulesbase"/updates/virt
elif [ -f ${modulesbase}/kernel/drivers/scsi/qla2xxx/qla2xxx.ko ]; then
	cp -f ${modulesbase}/kernel/drivers/scsi/qla2xxx/qla2xxx.ko "$modulesbase"/updates/virt
fi

#each system has its own way, based on the presence of a few executables, we can assume certain things 
echo "Recreating initrd image"
which dracut > /dev/null 2>&1
if [ "$?" = "0" -a -f /etc/redhat-release ]; then
	dracut -f /boot/initramfs-${KERNEL_VERSION}.img $KERNEL_VERSION
elif [ -x /sbin/installkernel -a -r /boot/vmlinuz-$KERNEL_VERSION -a -r /boot/System.map-$KERNEL_VERSION ]; then
	unlink /boot/vmlinuz-$KERNEL_VERSION /boot/.vmlinuz-$KERNEL_VERSION-qstor
	cp -f /boot/vmlinuz-$KERNEL_VERSION /boot/.vmlinuz-$KERNEL_VERSION-qstor
	unlink /boot/System.map-$KERNEL_VERSION /boot/.System.map-$KERNEL_VERSION-qstor
	cp -f /boot/System.map-$KERNEL_VERSION /boot/.System.map-$KERNEL_VERSION-qstor
	rm -f /boot/vmlinuz-$KERNEL_VERSION /boot/System.map-$KERNEL_VERSION
	/sbin/installkernel $KERNEL_VERSION /boot/.vmlinuz-$KERNEL_VERSION-qstor /boot/.System.map-$KERNEL_VERSION-qstor
	rm -f /boot/.vmlinuz-$KERNEL_VERSION-qstor /boot/.System.map-$KERNEL_VERSION-qstor
elif [ -x /sbin/new-kernel-pkg ]; then
	if [ -x /sbin/dracut ]; then
		/sbin/new-kernel-pkg --mkinitrd --dracut --host-only --depmod --install $KERNEL_VERSION
	else
		/sbin/new-kernel-pkg --mkinitrd --depmod --install $KERNEL_VERSION
	fi
	/sbin/new-kernel-pkg --rpmposttrans $KERNEL_VERSION
elif [ -x /usr/sbin/update-initramfs ]; then
	/usr/sbin/update-initramfs -c -t -k $KERNEL_VERSION
elif [ -x /sbin/mkinitrd -a -d /lib/modules/$KERNEL_VERSION ]; then
	#Assume SLES For now
	/sbin/mkinitrd -k vmlinuz-$KERNEL_VERSION \
		-i initrd-$KERNEL_VERSION \
		-b $INSTALL_PATH
elif [ -f /etc/SUSE-brand ]; then
	dracut -f --regenerate-all
else
	echo "Dont know how to create initrd image"
fi
