#!/usr/bin/perl

#--------------------------------------------------------------------------------------
#  Project	 : hcl
#  File          : hcllshwinfo
#  Author        : Keerthan Muthurasa <kmuthurasa at mandriva dot com>
#  Created On    : Mon Aug 27 11:15:03 2007
#  Purpose       : Collect data about hardware ,using lshw tool then format in an xml
#  		   format and write data in a file
# -------------------------------------------------------------------------------------

use strict;
close(STDOUT);
close(STDERR);

if(scalar(@ARGV) != 1)
{
	print "hcllshwinfo class]\n";
	print "class:\n
	       cpu\n
	       removable\n
	       storage\n
	       controller\n
	       network\n
	       display\n
	       input\n
	       communication\n
	       bridge\n
	       multimedia\n";
	exit 1;
}

# depending of the type of the component
# data is stored in different kind xml file
my $choice=$ARGV[0];
my %file=(
	cpu =>"processor.xml",
	removable =>"removable.xml",
	storage =>"storage.xml",
	controller =>"controller.xml",
	network =>"network.xml",
	display =>"video_card.xml",
	input =>"input.xml",
	communication =>"modem.xml",
	bridge =>"bridge.xml",
	multimedia =>"sound_card.xml"
);
my $path="/tmp/report";
my $pid = open(PROC,"-|");
my $start=0;
if($pid)
{
	open(OFIL,">$path/$file{$choice}");
	while(<PROC>)
	{
			processor($_) if($choice eq "cpu");
			removable($_) if($choice eq "removable");
			storage($_) if($choice eq "storage");
			controller($_) if($choice eq "controller");
			network($_) if($choice eq "network");
			video_card($_) if($choice eq "display");
			input($_) if($choice eq "input");
			modem($_) if($choice eq "communication");
			bridge($_) if($choice eq "bridge");
			sound_card($_) if($choice eq "multimedia");
	}
	print OFIL "</$choice>\n" if($choice eq "controller" || $choice eq "input" || $choice eq "bridge");

}
else
{
	if($choice eq "removable" || $choice eq "storage")
	{
		exec("lshw -class disk");
		exit 1;
	}
	elsif($choice eq "controller")
	{
		exec("lshw -class bus");
		exit 1;
	}
	else
	{
		exec ("lshw -class $choice");
		exit 1;
	}
}

sub trim($)
{
	my $string = shift;
	$string =~ s/^\s+//;
	$string =~ s/\s+$//;
	return $string;

}

sub processor
{
	my ($line) = @_;
	if($start == 1)
	{
			my @data = split(': ',$line);
			$data[0]=trim($data[0]);
			$data[0]=~ s/ /_/;
			$data[1]=trim($data[1]);
			$data[1]=~ s/\n//;

			if( $line !~ /^.*description:.*/ && $line !~ /^.*physical id:.*/ && $line !~ /^.*bus info:.*/ && $line !~ /^.*slot:.*/ && $line !~ /^.*width:.*/ && $line !~ /^.*size:.*/)
			{
				print OFIL "<$data[0]>$data[1]</$data[0]>\n";
			}
				
	}

	if($line =~ /^  \*-cpu.*/)
	{
		$start=1;
		print OFIL "<$choice>\n";
	}	

	if($line =~ /^.*clock:.*/)
	{
       		$start=0;
	}
}

sub removable 
{
	my ($line) = @_;
	if($start == 1)
	{
			my @data = split(': ',$line);
			$data[0]=trim($data[0]);
			$data[0] =~ s/ /_/;
			$data[1]=trim($data[1]);
			$data[1]=~ s/\n//;

			if($line !~ /^.*physical id:.*/ && $line !~ /^.*logical name:.*/)
			{
				if($line =~ /^.*capabilities:.*/)
				{
					my @split=split(" ",$data[1]);
					print OFIL "<$data[0]>\n";
					while(scalar(@split) > 0)
					{
						print OFIL "\t<capability>".pop(@split)."</capability>\n";
					}
					print OFIL "</$data[0]>\n";
				}
				elsif($line =~ /^.*bus info:.*/)
				{
					my @split=split("@",$data[1]);
					print OFIL "<$data[0]>$split[0]</$data[0]>\n";
				}
				else
				{
					print OFIL "<$data[0]>$data[1]</$data[0]>\n";
				}
			}
				
	}

	if($line =~ /^  \*-cdrom.*/)
	{
		$start=1;
		print OFIL "<$choice>\n";
	}	

	if($line =~ /^.*capabilities.*/)
	{
		if($start ==1)
		{
			print OFIL "</$choice>\n";
		}
       		$start=0;
	}
}

sub storage 
{
	my ($line) = @_;
	if($start == 1)
	{
			my @data = split(': ',$line);
			$data[0]=trim($data[0]);
			$data[0] =~ s/ /_/;
			$data[1]=trim($data[1]);
			$data[1]=~ s/\n//;

			if($line !~ /^.*physical id:.*/ && $line !~ /^.*logical name:.*/)
			{
				if($line =~ /^.*capabilities:.*/)
				{
					my @split=split(" ",$data[1]);
					print OFIL "<$data[0]>\n";
					while(scalar(@split) > 0)
					{
						print OFIL "\t<capability>".pop(@split)."</capability>\n";
					}
					print OFIL "</$data[0]>\n";
				}
				elsif($line =~ /^.*bus info:.*/)
				{
					my @split=split("@",$data[1]);
					print OFIL "<$data[0]>$split[0]</$data[0]>\n";
				}
				else
				{
					print OFIL "<$data[0]>$data[1]</$data[0]>\n";
				}
			}
				
	}

	if($line =~ /^  \*-disk.*/)
	{
		$start=1;
		print OFIL "<$choice>\n";
	}	
	
	if($line =~ /^.*capabilities.*/)
	{
		if($start==1)
		{
			print OFIL "</$choice>\n";
		}
       		$start=0;

	}
}

sub controller 
{
	my ($line) = @_;
	if($start == 1)
	{
			my @data = split(': ',$line);
			$data[0]=trim($data[0]);
			$data[0] =~ s/ /_/;
			$data[1]=trim($data[1]);
			$data[1]=~ s/\n//;

			if($line !~ /^.*physical id:.*/ && $line !~ /^.*logical name:.*/ && $line !~ /^.*\*-.*/)
			{
					
				if($line =~ /^.*capabilities:.*/ || $line =~ /^.*configuration:.*/)
				{
					if($line =~ /^.*capabilities:.*/)
					{
						my @split=split(" ",$data[1]);
						print OFIL "<$data[0]>\n";
						while(scalar(@split) > 0)
						{
							print OFIL "\t<capability>".pop(@split)."</capability>\n";
						}
						print OFIL "</$data[0]>\n";
					}
					else
					{
						my @split=split(" ",$data[1]);
						my $find =0;
						while(scalar(@split) > 0 && $find==0)
						{
							my $tmp=pop(@split);
							if($tmp =~ /module/)
							{
								my @split_=split("=",$tmp);
								print OFIL "<module>$split_[1]</module>\n";
								$find = 1;
							}
						}

					}

				}
				elsif($line =~ /^.*bus info:.*/)
				{
					my @split=split("@",$data[1]);
					print OFIL "<$data[0]>$split[0]</$data[0]>\n";
				}
				else
				{
					print OFIL "<$data[0]>$data[1]</$data[0]>\n";
				}
			}
				
	}

	if($line =~ /^.*\*-.*/ && $start==1)
	{
		if($start==1)
		{
			print OFIL "</$choice>\n";
		}
       		$start=0;
	}
	if($line =~ /^.*\*-.*/ && $line !~ /^.*\*-core.*/)
	{
		$start=1;
		print OFIL "<$choice>\n";
	}	

}

sub network 
{

	my ($line) = @_;
	if($start == 1)
	{
			my @data = split(': ',$line);
			$data[0]=trim($data[0]);
			$data[0] =~ s/ /_/;
			$data[1]=trim($data[1]);
			$data[1]=~ s/\n//;

			if($line !~ /^.*physical id:.*/)
			{
				if($line =~ /^.*capabilities:.*/ || $line =~ /^.*configuration:.*/)
				{
					if($line =~ /^.*capabilities:.*/)
					{
						my @split=split(" ",$data[1]);
						print OFIL "<$data[0]>\n";
						while(scalar(@split) > 0)
						{
							print OFIL "\t<capability>".pop(@split)."</capability>\n";
						}
						print OFIL "</$data[0]>\n";
					}
					else
					{
						my @split=split(" ",$data[1]);
						while(scalar(@split) > 0)
						{
							my $tmp=pop(@split);
							my @split_=split("=",$tmp);
							print OFIL "<$split_[0]>$split_[1]</$split_[0]>\n";
							
						}


					}
				}
				elsif($line =~ /^.*bus info:.*/)
				{
					my @split=split("@",$data[1]);
					print OFIL "<$data[0]>$split[0]</$data[0]>\n";
				}
				else
				{
					print OFIL "<$data[0]>$data[1]</$data[0]>\n";
				}
			}
				
	}

	if($line =~ /^  \*-network.*/)
	{
		$start=1;
		print OFIL "<$choice>\n";
	}	

	if($line =~ /^.*configuration:.*/)
	{
		if($start ==1)
		{
			print OFIL "</$choice>\n";
		}
       		$start=0;
	}
}



sub video_card 
{
	my ($line) = @_;
	if($start == 1)
	{
			my @data = split(': ',$line);
			$data[0]=trim($data[0]);
			$data[0] =~ s/ /_/;
			$data[1]=trim($data[1]);
			$data[1]=~ s/\n//;

			if($line !~ /^.*physical id:.*/)
			{
				if($line =~ /^.*capabilities:.*/ || $line =~ /^.*configuration:.*/)
				{
					if($line =~ /^.*capabilities:.*/)
					{
						my @split=split(" ",$data[1]);
						print OFIL "<$data[0]>\n";
						while(scalar(@split) > 0)
						{
							print OFIL "\t<capability>".pop(@split)."</capability>\n";
						}
						print OFIL "</$data[0]>\n";
					}
					else
					{
						my @split=split(" ",$data[1]);
						while(scalar(@split) > 0)
						{
							my $tmp=pop(@split);
							my @split_=split("=",$tmp);
							print OFIL "<$split_[0]>$split_[1]</$split_[0]>\n";
							
						}


					}
				}
				elsif($line =~ /^.*bus info:.*/)
				{
					my @split=split("@",$data[1]);
					print OFIL "<$data[0]>$split[0]</$data[0]>\n";
				}
				else
				{
					print OFIL "<$data[0]>$data[1]</$data[0]>\n";
				}
			}
				
	}

	if($line =~ /^  \*-display.*/)
	{
		$start=1;
		print OFIL "<$choice>\n";
	}	

	if($line =~ /^.*configuration:.*/)
	{
		if($start ==1)
		{
			print OFIL "</$choice>\n";
		}
       		$start=0;
	}
}

sub input 
{
	my ($line) = @_;
	if($start == 1)
	{
			my @data = split(': ',$line);
			$data[0]=trim($data[0]);
			$data[0] =~ s/ /_/;
			$data[1]=trim($data[1]);
			$data[1]=~ s/\n//;

			if($line !~ /^.*physical id:.*/ && $line !~ /^.*\*-.*/)
			{
					
				if($line =~ /^.*capabilities:.*/ || $line =~ /^.*configuration:.*/)
				{
					if($line =~ /^.*capabilities:.*/)
					{
						my @split=split(" ",$data[1]);
						print OFIL "<$data[0]>\n";
						while(scalar(@split) > 0)
						{
							print OFIL "\t<capability>".pop(@split)."</capability>\n";
						}
						print OFIL "</$data[0]>\n";
					}
					else
					{
						my @split=split(" ",$data[1]);
						my $find =0;
						while(scalar(@split) > 0 && $find==0)
						{
							my $tmp=pop(@split);
							if($tmp =~ /module/)
							{
								my @split_=split("=",$tmp);
								print OFIL "<module>$split_[1]</module>\n";
								$find = 1;
							}
						}

					}

				}
				elsif($line =~ /^.*bus info:.*/)
				{
					my @split=split("@",$data[1]);
					print OFIL "<$data[0]>$split[0]</$data[0]>\n";
				}
				else
				{
					print OFIL "<$data[0]>$data[1]</$data[0]>\n";
				}
			}
				
	}

	if($line =~ /^.*\*-.*/ && $start==1)
	{
		if($start==1)
		{
			print OFIL "</$choice>\n";
		}
       		$start=0;
	}
	if($line =~ /^.*\*-.*/)
	{
		$start=1;
		print OFIL "<$choice>\n";
	}	

}



sub modem 
{
	my ($line) = @_;
	if($start == 1)
	{
			my @data = split(': ',$line);
			$data[0]=trim($data[0]);
			$data[0] =~ s/ /_/;
			$data[1]=trim($data[1]);
			$data[1]=~ s/\n//;

			if($line !~ /^.*physical id:.*/ && $line !~ /^.*\*-.*/)
			{
					
				if($line =~ /^.*capabilities:.*/ || $line =~ /^.*configuration:.*/)
				{
					if($line =~ /^.*capabilities:.*/)
					{
						my @split=split(" ",$data[1]);
						print OFIL "<$data[0]>\n";
						while(scalar(@split) > 0)
						{
							print OFIL "\t<capability>".pop(@split)."</capability>\n";
						}
						print OFIL "</$data[0]>\n";
					}
					else
					{
						my @split=split(" ",$data[1]);
						my $find =0;
						while(scalar(@split) > 0 && $find==0)
						{
							my $tmp=pop(@split);
							if($tmp =~ /module/)
							{
								my @split_=split("=",$tmp);
								print OFIL "<module>$split_[1]</module>\n";
								$find = 1;
							}
						}

					}

				}
				elsif($line =~ /^.*bus info:.*/)
				{
					my @split=split("@",$data[1]);
					print OFIL "<$data[0]>$split[0]</$data[0]>\n";
				}
				else
				{
					print OFIL "<$data[0]>$data[1]</$data[0]>\n";
				}
			}
				
	}

	if($line =~ /^.*configuration:.*/ && $start==1)
	{
		if($start==1)
		{
			print OFIL "</$choice>\n";
		}
       		$start=0;
	}
	if($line =~ /^.*\*-communication.*/)
	{
		$start=1;
		print OFIL "<$choice>\n";
	}	

}

sub bridge 
{
	my ($line) = @_;
	if($start == 1)
	{
			my @data = split(': ',$line);
			$data[0]=trim($data[0]);
			$data[0] =~ s/ /_/;
			$data[1]=trim($data[1]);
			$data[1]=~ s/\n//;

			if($line !~ /^.*physical id:.*/ && $line !~ /^.*logical name:.*/ && $line !~ /^.*\*-.*/)
			{
					
				if($line =~ /^.*capabilities:.*/ || $line =~ /^.*configuration:.*/)
				{
					if($line =~ /^.*capabilities:.*/)
					{
						my @split=split(" ",$data[1]);
						print OFIL "<$data[0]>\n";
						while(scalar(@split) > 0)
						{
							print OFIL "\t<capability>".pop(@split)."</capability>\n";
						}
						print OFIL "</$data[0]>\n";
					}
					else
					{
						my @split=split(" ",$data[1]);
						my $find =0;
						while(scalar(@split) > 0 && $find==0)
						{
							my $tmp=pop(@split);
							if($tmp =~ /module/)
							{
								my @split_=split("=",$tmp);
								print OFIL "<module>$split_[1]</module>\n";
								$find = 1;
							}
						}

					}

				}
				elsif($line =~ /^.*bus info:.*/)
				{
					my @split=split("@",$data[1]);
					print OFIL "<$data[0]>$split[0]</$data[0]>\n";
				}
				else
				{
					print OFIL "<$data[0]>$data[1]</$data[0]>\n";
				}
			}
				
	}

	if($line =~ /^.*\*-.*/ && $start==1)
	{
		if($start==1)
		{
			print OFIL "</$choice>\n";
		}
       		$start=0;
	}
	if($line =~ /^.*\*-.*/)
	{
		$start=1;
		print OFIL "<$choice>\n";
	}	

}

sub sound_card 
{
	my ($line) = @_;
	if($start == 1)
	{
			my @data = split(': ',$line);
			$data[0]=trim($data[0]);
			$data[0] =~ s/ /_/;
			$data[1]=trim($data[1]);
			$data[1]=~ s/\n//;

			if($line !~ /^.*physical id:.*/)
			{
				if($line =~ /^.*capabilities:.*/ || $line =~ /^.*configuration:.*/)
				{
					if($line =~ /^.*capabilities:.*/)
					{
						my @split=split(" ",$data[1]);
						print OFIL "<$data[0]>\n";
						while(scalar(@split) > 0)
						{
							print OFIL "\t<capability>".pop(@split)."</capability>\n";
						}
						print OFIL "</$data[0]>\n";
					}
					else
					{
						my @split=split(" ",$data[1]);
						while(scalar(@split) > 0)
						{
							my $tmp=pop(@split);
							my @split_=split("=",$tmp);
							print OFIL "<$split_[0]>$split_[1]</$split_[0]>\n";
							
						}


					}
				}
				elsif($line =~ /^.*bus info:.*/)
				{
					my @split=split("@",$data[1]);
					print OFIL "<$data[0]>$split[0]</$data[0]>\n";
				}
				else
				{
					print OFIL "<$data[0]>$data[1]</$data[0]>\n";
				}
			}
				
	}

	if($line =~ /^  \*-multimedia.*/)
	{
		$start=1;
		print OFIL "<$choice>\n";
	}	

	if($line =~ /^.*configuration:.*/)
	{
		if($start ==1)
		{
			print OFIL "</$choice>\n";
		}
       		$start=0;
	}
}

