#!/bin/sh
# NAME=HDD detect
# DESCRIPTION=Detect hard drives using einarc, smartctl and hal-device.
# DEPENDS=HDD

einarc_detect()
{
	einarc -l | cut -f1 | while read TYPE; do
		einarc -t "$TYPE" physical list | while read L; do
			HDD_VENDOR=`echo "$L" | cut -f2 | cut -f1 -d' '`
			HDD_MODEL=`echo "$L" | cut -f2 | cut -f2 -d' '`
			HDD_SERIAL=`echo "$L" | cut -f4`
			HDD_VERSION="" # Einarc currently doesn't support HDD version retrieving
			echo HDD "$HDD_VENDOR" "$HDD_MODEL" "$HDD_SERIAL" ' - einarc' >> $HOME/debug.log
			add_component HDD "$HDD_VENDOR" "$HDD_MODEL" "$HDD_SERIAL" "$HDD_VERSION"
		done
	done
}

hdd_detected()
{
	local udi="$1"
	while [ -n "$udi" ]; do
		if udi=`hal-get-property --udi "$udi" --key info.parent 2>$DEBUG_TTY`; then
			PCI_VENDOR_ID=`hal-get-property --udi "$udi" --key pci.vendor_id --hex 2>$DEBUG_TTY`
			PCI_PRODUCT_ID=`hal-get-property --udi "$udi" --key pci.product_id --hex 2>$DEBUG_TTY`
			PCI_SUBVENDOR_ID=`hal-get-property --udi "$udi" --key pci.subsys_vendor_id --hex 2>$DEBUG_TTY`
			PCI_SUBPRODUCT_ID=`hal-get-property --udi "$udi" --key pci.subsys_product_id --hex 2>$DEBUG_TTY`
			ID="$PCI_VENDOR_ID:$PCI_PRODUCT_ID:$PCI_SUBVENDOR_ID:$PCI_SUBPRODUCT_ID"
			if [ -n "`cat "$HOME/einarc_detects.log" | grep "$ID"`" ]; then
				return 0
				break
			fi
			if [ "`hal-get-property --udi "$udi" --key info.bus 2>$DEBUG_TTY`" = 'usb' ]; then
				return 0;
				break;
			fi
		fi
	done
	return 1
}

strip_vendor()
{
	if echo $HDD_MODEL | grep -qi "^$1"; then
		HDD_VENDOR=$2
		HDD_MODEL=`echo $HDD_MODEL | sed "s/^$1//i"`
	fi
}

detect_vendor()
{
	if echo $HDD_MODEL | grep -qi "$1"; then
		HDD_VENDOR=$2
	fi
}

hal_detect()
{
	for UDI in `hal-find-by-property --key storage.drive_type --string 'disk'`; do
		if ! hdd_detected "$UDI"; then	
			HDD_DEV=`hal-get-property --udi "$UDI" --key block.device`
			HDD_MODEL=`hal-get-property --udi "$UDI" --key info.product`
			HDD_VENDOR=`hal-get-property --udi "$UDI" --key storage.vendor`
			HDD_SERIAL=`smartctl -d ata -a $HDD_DEV |
				    sed -ne '/^Serial Number:/ s/^Serial Number: *//p'`
			HDD_VERSION=""

			detect_vendor '^ST.*' 'Seagate'
			detect_vendor '^D...-.*' 'IBM'
			detect_vendor '^IBM.*' 'IBM'
			detect_vendor '^HITACHI.*' 'Hitachi'
			detect_vendor '^IC.*' 'Hitachi'
			detect_vendor '^HTS.*' 'Hitachi'
			detect_vendor '^HDS.*' 'Hitachi'
			detect_vendor '^FUJITSU.*' 'Fujitsu'
			detect_vendor '^MP.*' 'Fujitsu'
			detect_vendor '^TOSHIBA.*' 'Toshiba'
			detect_vendor '^MK.*' 'Toshiba'
			detect_vendor '^MAXTOR.*' 'Maxtor'
			detect_vendor '^Pioneer.*' 'Pioneer'
			detect_vendor '^PHILIPS.*' 'Philips'
			detect_vendor '^QUANTUM.*' 'Quantum'
			detect_vendor 'FIREBALL.*' 'Quantum'
			detect_vendor '^WDC.*' 'Western Digital'
			detect_vendor 'WD.*' 'Western Digital'

			strip_vendor 'Maxtor ' 'Maxtor'
			strip_vendor 'WDC ' 'Western Digital'
			strip_vendor 'Hitachi ' 'Hitachi'
		
			echo HDD "$HDD_VENDOR" "$HDD_MODEL" "$HDD_SERIAL" ' - hal' >> $HOME/debug.log
			add_component HDD "$HDD_VENDOR" "$HDD_MODEL" "$HDD_SERIAL" "$HDD_VERSION"
		fi	
	done
}

einarc_detect
hal_detect
