#!/bin/bash
#****************************************************************************
# Copyright (c) 2024 xFusion Digital Technologies Co., Ltd.All rights reserved.
# Description: A bash script for loading a kernel module and simulating fault scenarios.
# Author: xFusion Digital Technologies
# Create: 2024-10-18
#****************************************************************************

device="kpgen"
kpgen_load_alarm_id=1030
ModName=`lsmod | grep -w "^$device" | awk '{print $1}'`

if [ "$ModName" != "" ]; then
    echo "$0: Module $device has been loaded!"
    command -v sendalarm &> /dev/null && \
    sendalarm -i $kpgen_load_alarm_id -t event -l 4 -m "Module $device has been loaded!" -e "$0"
    exit 1
fi

# remove stale nodes
rm -f /dev/${device} 2> /dev/null
RProcessTimeout="121"
DProcessTimeout="481"

while getopts "d:r:h" OPTIONS
do
    case $OPTIONS in
        r) RProcessTimeout="$OPTARG";;
        d) DProcessTimeout="$OPTARG";;
        \?) echo "ERROR - Invalid parameter"; echo "ERROR - Invalid parameter" >&2; exit 1;;
        *) echo "ERROR - Invalid parameter";  echo "ERROR - Invalid parameter" >&2; exit 1;;
    esac
done

FILE="/etc/mcage/threshold.conf"

if [ ! -f "$FILE" ]; then
    echo "Error: File '$FILE' does not exist." >&2
    sendalarm -i $kpgen_load_alarm_id -t event -l 1 \
        -m "File '$FILE' does not exist." -e "$0"
    exit 2
fi
if ! grep -q '^kpgen=4096$' "$FILE"; then
    echo "kpgen=4096" >> "$FILE"
fi

# invoke insmod with all arguments we got
# and use a pathname, as newer modutils don't look in . by default
/sbin/modprobe ${device} \
              RProcessTimeout="${RProcessTimeout}"\
              DProcessTimeout="${DProcessTimeout}"
if [ $? -ne 0 ]; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] Failed to load kernel module: $device" >&2
    sendalarm -i $kpgen_load_alarm_id -t event -l 2 \
        -m "failed to load kernel module: $device" -e "$0"
    exit 3
fi

exit 0
