#!/bin/sh
# NAME=Disk controller detect
# DESCRIPTION=Detect disk controllers through einarc and hal-device with required priority.
# DEPENDS=Disk Controller

einarc_detect()
{
	einarc -l | while read L; do
		CTRL_TYPE=`echo "$L" | cut -f1`
		CTRL_NUM=`echo "$L" | cut -f2`
		CTRL_MODEL=`echo "$L" | cut -f3`
		CTRL_INFO=`einarc -t $CTRL_TYPE -a $CTRL_NUM adapter info`
		CTRL_SERIAL=`echo "$CTRL_INFO" | sed -n "s/Serial number\t//p" | sed 's/[^ -~]//g'`
		CTRL_VERSION=`echo "$CTRL_INFO" | sed -n '/Firmware version/s/^Firmware version\s*\(.*\)$/\1/p'`
			      
		case $CTRL_TYPE in
			'amcc') CTRL_VENDOR='3Ware/AMCC';;
			'areca') CTRL_VENDOR='Areca';;
			'lsi_megarc') CTRL_VENDOR='LSI';;
			'lsi_megcli') CTRL_VENDOR='LSI';;
			'adaptec_aaccli') CTRL_VENDOR='Adaptec';;
			'adaptec_arcconf') CTRL_VENDOR='Adaptec';;
		esac
		echo 'Disk Controller' "$CTRL_VENDOR" "$CTRL_MODEL" "$CTRL_SERIAL" - einarc >> $HOME/debug.log
		add_component 'Disk Controller' "$CTRL_VENDOR" "$CTRL_MODEL" "$CTRL_SERIAL" "$CTRL_VERSION"
	done
}

ctrl_detected()
{
	if [ -n "`cat $HOME/einarc_detects.log | grep "$1"`" ]; then
		return 0
	else
		return 1
	fi
}

strip_vendor()
{
	CTRL_VENDOR=`echo "$1" | sed '	s/, Ltd\.//g;
		s/ microsystems$//gi;
		s/ systems$//gi;
		s/ technologies$//gi;
		s/Co\.,//g;
		s/Ltd\.//g;
		s/Co\.//g;
		s/Corp\.//g;
		s/Corporation//g;
		s/ System Inc$//gi;
		s/, Inc\.//g;
		s/, Inc//g;
		s/Inc\.//g;
		s/Inc$//g;
		s/, Ltd//g;
		s/ Ltd$//g;
		s/ Co$//g;
		s/American Megatrends/AMI/g;
		s/Realtek Semiconductor/Realtek/g;
		s/Advanced Micro Devices \[AMD\]/AMD/g;
		s/Silicon Integrated Systems \[SiS\]/SiS/g;
		s/VIA Technologies Inc\./VIA/g;
		s/VIA Technologies/VIA/g;
		s/Agere Systems (former Lucent Microelectronics)/Agere/g;
		s/ATI Technologies/ATI/g;
		s/nVidia Corporation/nVidia/g;
		s/Hightech Information System/HIS/g;
		s/Marvell Technology Group/Marvell/g;
		s!Linksys, A Division of Cisco Systems!Linksys/Cisco!g;
		s/Atheros Communications/Atheros/g;
		s/INPROCOMM IPN 2220 Wireless LAN Adapter (rev 01)/INPROCOMM IPN 2220/g;
		s/VT8378 \[S3 UniChrome\] Integrated/VT8378 [S3 UniChrome] Int./g;
		s/S3 Unichrome Pro VGA Adapter/S3 UniChrome Pro/g;
		s/nVidia/NVIDIA/g;
		s/  *$//g;'`
}

hal_detect()
{
	for UDI in `$SHARE_DIR/hal-searcher --key pci.device_class --value 1`; do
		CTRL_PCI_VENDOR_ID=`hal-get-property --udi "$UDI" --key pci.vendor_id --hex 2>$DEBUG_TTY`
		CTRL_PCI_PRODUCT_ID=`hal-get-property --udi "$UDI" --key pci.product_id --hex 2>$DEBUG_TTY`
		CTRL_PCI_SUBVENDOR_ID=`hal-get-property --udi "$UDI" --key pci.subsys_vendor_id --hex 2>$DEBUG_TTY`
		CTRL_PCI_SUBPRODUCT_ID=`hal-get-property --udi "$UDI" --key pci.subsys_product_id --hex 2>$DEBUG_TTY`
		if ! ctrl_detected "$CTRL_PCI_VENDOR_ID:$CTRL_PCI_PRODUCT_ID:$CTRL_PCI_SUBVENDOR_ID:$CTRL_PCI_SUBPRODUCT_ID"; then
			CTRL_VENDOR=`hal-get-property --udi "$UDI" --key pci.vendor`
			CTRL_MODEL=`hal-get-property --udi "$UDI" --key info.product`
			strip_vendor "$CTRL_VENDOR"
			echo 'Disk Controller' "$CTRL_VENDOR" "$CTRL_MODEL" '' - hal >> $HOME/debug.log
			add_component 'Disk Controller' "$CTRL_VENDOR" "$CTRL_MODEL" "" ""
		fi
	done
}

einarc_detect
hal_detect
