#!/usr/bin/perl

########################################################################
##
## This script will create a registry tree based on the detected HW
## located in /etc/sysconfig/hwconf. That file is parsed and
## re-generated at every boot by kudzu.
##
## This script must calculate a unique ID for each device. It can't
## be sequential because sequence may change. It can't be only the
## description of device, because you may have 2 identical devices.
##
## It will generate 2 trees for faster searches:
##    system/hw/byClass    and
##    system/hw/byBus
## The entries in the second tree are links to the first.
##
## The correct way to run it is:
##
## bash# ./hwconfKudzu-convert | sh -e
##
##
## To make tests you can do:
##
## bash$ ROOT=user/test ./hwconfKudzu-convert | sh -e
##
## Avi Alkalay <avi@unix.sh>
## Apr 2004
##
## $Id$
##
########################################################################


$HWFILE="/etc/sysconfig/hwconf";
$ROOT="system/hw";
$RG="kdb";



sub printEntry {
	if (%entry) {
		$entry{desc}=~s/^\"(.*)\"$/$1/; # remove "
		
		$uniqDevID=$entry{desc};
		$uniqDevID=~s/[\W|\s]*//g;
		if (defined($entry{pcifn})) {
			$uniqDevID.=$entry{pcifn};
		} elsif (defined($entry{usbbus})) {
			$uniqDevID.=$entry{usbbus};
		} elsif (defined($entry{device})) {
			$uniqDevID.=$entry{device};
		} else {
			printf STDERR "Can't calculate unique identifier for \"$entry{desc}\"\n";
			return;
		}
		
		# Some escaping and treatments
		$entry{desc}=~s/\'/\\'/g;       # escape '
		$entry{desc}=~s/\"/\\"/g;       # escape "
		$entry{desc}=~s/\(/\\\(/g;      # escape (
		$entry{desc}=~s/\)/\\\)/g;      # escape )
		$entry{desc}=~s/\|/\\\|/g;      # escape |
		$entry{desc}=~s/\#/\\\#/g;      # escape #
		
		foreach $key (keys(%entry)) {
			print("$RG set $ROOT/byClass/$entry{class}/$uniqDevID/$key " );
			print("-- $entry{$key}\n");
		}

		# Make link for the 'byBus' tree
		# print("$RG set -t dir \"$ROOT/byBus/$entry{bus}\"\n");
		print("$RG ln \"$ROOT/byClass/$entry{class}/$uniqDevID\" \"$ROOT/byBus/$entry{bus}/$uniqDevID\"\n\n");
	}
}



open(HWFILE);

while(<HWFILE>) {
	SWITCH: {
		if (/^-$/) {
			printEntry(%entry);
			undef(%entry);
			last SWITCH;
		}
# 		if (/^class\:\s*(.*)/) {
# 			$entry{class}=$1;
# 			last SWITCH;
# 		}
# 		if (/^bus\:\s*(.*)/) {
# 			$entry{bus}=$1;
# 			last SWITCH;
# 		}
		/(.*)\:\s+(.*)/;
		$entry{$1}=$2;
	}
}

close(HWFILE);

# Handle last entry
printEntry(%entry);
