Hi, Here's a hardware inventory program written in Perl. HTH. Bill On Sat, 10 Nov 2001, Richard Villa wrote: > I am wondering if anyone knows of a function under Linux that is simular > to the system information function under windowsx that will let the user > know what hardware is configured. > > Richard > > > > _______________________________________________ > Speakup mailing list > Speakup at braille.uwo.ca > http://speech.braille.uwo.ca/mailman/listinfo/speakup > -------------- next part -------------- #!/usr/bin/perl # # Copyright (C) 1998, Larry McVoy (lm at bitmover.com) # Copyright (C) 1998, 1999, Raju Mathur (raju at linux-delhi.org) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # hinv v 1.4pre2 # # Changes: # 1.0 - 1.1 # --------- # Fri Nov 28 14:28:31 IST 1997 # Added support for IDE disks -- Paul Danset (paul at oz.net), # Fri Nov 28 14:39:30 IST 1997 # Changed eth scanning routine to explicitely check for an # ethernet-style address in the line. # -- Raju Mathur (raju at linux-delhi.org) # Fri Nov 28 19:02:22 IST 1997 # 1.1-1.1a # -------- # Small screw-up in the eth code fixed. Thanks, Thomas Gebhardt! # 1.1a-1.2 # -------- # Mon Dec 1 12:06:55 IST 1997 # Added support for sound devices. I've only checked this out on # a commercial OSS system, not with the built-in OSS/Linux/Free. # I'm no hotshot Perl programmer, so if the code looks ugly it's # your aesthetics which are to blame :-) # # 1.2-1.3 # ------- # Memory-handling code improvements # Floppy code changes # # 1.3-1.4pre2 # ------- # Tue Jul 20 20:24:03 IST 1999 # The OSS changes work fine on OSS included in the kernel. # Changed the IDE code around: # - No more duplicate IDE's # - Use a hash instead of an array # - Change to give more verbose output # CPU code changed to handle new 2.2.x /proc/cpuinfo style # Sound code changed to use /proc/sound (doesn't automatically # load sound drivers). # Display parallel ports from /proc/parport/* # Get memory info from /proc/meminfo rather than dmesg (which # scrolls around) # Larry has agreed to to GPL the code... Eyahooo! # # 1.4pre1 - 1.4pre2 # ----------------- # Sat Sep 11 09:14:24 IST 1999 # Added support for ALSA sound devices (/proc/asound/sndstat) # # There may still be problems in the CPU counting code. Please # send samples of /proc/cpuinfo and hinv output for multi-CPU # systems. # -- Raju Mathur (raju at linux-delhi.org) # # Author: Larry Mcvoy (lm at bitmover.com) # # Maintainer: Raju Mathur (raju at linux-delhi.org) # # Try and emulate SGI's hinv command # We want to figure out the following: # CPU type, mhz, memory, busses, floppies, disks, tapes, cdroms, ttys, # networks, graphics, sound # indy ~ hinv # Iris Audio Processor: version A2 revision 4.1.0 # 1 175 MHZ IP22 Processor # FPU: MIPS R4000 Floating Point Coprocessor Revision: 0.0 # CPU: MIPS R4400 Processor Chip Revision: 6.0 # On-board serial ports: 2 # On-board bi-directional parallel port # Data cache size: 16 Kbytes # Instruction cache size: 16 Kbytes # Secondary unified instruction/data cache size: 1 Mbyte on Processor 0 # Main memory size: 64 Mbytes # Vino video: unit 0, revision 0 # Integral ISDN: Basic Rate Interface unit 0, revision 1.0 # XPI FDDI controller: xpi0, firmware version 9601221233, SAS # Integral Ethernet: ec0, version 1 # Integral SCSI controller 0: Version WD33C93B, revision D # Disk drive: unit 2 on SCSI controller 0 # Disk drive: unit 1 on SCSI controller 0 # Graphics board: Indy 24-bit # i586 ~ hinv # Main memory size: 255 Mbytes # 1 GenuineIntel 00/07 processor # 2 16550A serial ports # 1 National Semiconductor PC87306 floppy controller # 1 1.44M floppy drive # 1 vga+ graphics device # 1 parallel port: # lp0: base 0x378, no irq, no dma, modes SPP,ECP,ECPPS2 # 1 IDE device: # /dev/hda: ATAPI 32X CD-ROM drive, 128kB Cache # 1 ethernet interface # eth0: OEM i82557/i82558 10/100 Ethernet # 1 SCSI disk # IBM DNES-309170Y # ESG-SHV SCA HSBP M6 # Sound devices: # 1 Audio device # MAD16 WSS (82C930) (DUPLEX) # 1 MIDI device # Mad16/Mozart # 1 Timer # System clock # 1 Mixer # MAD16 WSS (82C930) # PCI bus devices: # Ethernet controller: Intel 82557 (rev 5). # SCSI storage controller: NCR 53c810 (rev 35). # VGA compatible controller: Cirrus Logic GD 5480 (rev 35). # PIC: Intel Unknown device (rev 0). # ISA bridge: Intel 82371AB PIIX4 ISA (rev 2). # IDE interface: Intel 82371AB PIIX4 IDE (rev 1). # USB Controller: Intel 82371AB PIIX4 USB (rev 1). # Bridge: Intel 82371AB PIIX4 ACPI (rev 2). # Host bridge: Intel Unknown device (rev 3). # Host bridge: Intel Unknown device (rev 2). # Host bridge: Intel Unknown device (rev 2). # SCSI storage controller: NCR 53c896 (rev 1). # SCSI storage controller: NCR 53c896 (rev 1). $memsize = ( stat "/proc/kcore" ) [7] || die "Cannot stat /proc/kcore" ; # Use only int portion of the result on converting to MB. printf "Main memory size: %d Mbytes\n" , $memsize / 1024 / 1024 + .5 ; open(FD, "dmesg|") || die "no dmesg"; while (<FD>) { @_ = split; if (/^tty/) { $ttys{$_[$#_]}++; } elsif (/^Floppy/) { $floppyRE = "fd[0-9] is ([0-9.MGKB]*)" ; while ( /$floppyRE/o ) { $floppy{$1}++ ; s/$floppyRE// ; } } elsif (/^FDC /) { s/.*is a //; chop; $fdc{$_}++; } elsif (/^scsi : detected/) { $scsi = $_; } elsif (/^eth\d.* at .*:..:..:..:..:.*/) { s/\s*at .*//; push(@eth, $_); } elsif (/^(hd[a-z]).*, /) { $idedev=$1 ; s/.*:\s*//; $ide{$idedev} = $_ ; } } open(FD, "/proc/cpuinfo"); while (<FD>) { @_ = split /\s*:\s*/; if (/model name/) { $cpu = $_[$#_]; chomp $cpu ; $cpus{"$vendor $cpu"}++; } if (/vendor/) { $vendor = $_[$#_] ; chomp $vendor ; } } open(FD, "/proc/ioports"); while (<FD>) { if (/kbd/) { $kbd++; } elsif (/vga/) { @_ = split; $graphics{$_[$#_]}++; } } close FD ; foreach $port ( </proc/parport/*> ) { open FD , "$port/hardware" ; $str = "" ; while ( <FD> ) { @_ = split /\s*:\s*/ ; chomp $_[$#_] ; $str .= ", " if $. != 1 ; if ( $_[$#_] eq "none" ) { $str .= "no $_[0]" ; } else { $str .= "$_[0] $_[$#_]" ; } } $nlp++ ; close FD ; $lp{chop $port} = $str ; undef $str ; } print $mem if (defined $mem); foreach $key (keys %cpus) { print "$cpus{$key} $key processor"; print $cpus{$key} > 1 ? "s\n" : "\n"; } foreach $key (keys %ttys) { print "$ttys{$key} $key serial port"; print $ttys{$key} > 1 ? "s\n" : "\n"; } foreach $key (keys %fdc) { print "$fdc{$key} $key floppy controller"; print $fdc{$key} > 1 ? "s\n" : "\n"; } foreach $key (keys %floppy) { print "$floppy{$key} $key floppy drive"; print $floppy{$key} > 1 ? "s\n" : "\n"; } foreach $key (keys %graphics) { print "$graphics{$key} $key graphics device"; print $graphics{$key} > 1 ? "s\n" : "\n"; } if (defined $kbd) { print "$kbd keyboard"; print $kbd > 1 ? "s\n" : "\n"; } if ( $nlp ) { printf "$nlp parallel port%s:\n" , $nlp == 1 ? "" : "s" ; } foreach $keys (sort keys %lp ) { print " lp$keys: $lp{$keys}\n" ; } @ide = sort keys %ide ; if ($#ide > -1) { $n = $#ide + 1; print "$n IDE device"; print $n > 1 ? "s:\n" : ":\n"; foreach $ide (@ide) { print " /dev/$ide: $ide{$ide}"; } } if ($#eth > -1) { $n = $#eth + 1; print "$n ethernet interface"; print $n > 1 ? "s\n" : "\n"; foreach $eth (@eth) { print " $eth"; } } if (defined $scsi) { $scsi =~ s/.*detected //; $scsi =~ s/ total.//; print $scsi; open(FD, "/proc/scsi/scsi"); $_ = <FD>; while (<FD>) { next unless /Vendor/; s/.*Vendor:\s*//; s/\s*Rev:.*//; s/Model:\s*//; print " $_"; } } # # Sound code added by Raju Mathur (raju at linux-delhi.org) # if ( open ( FD , "/proc/sound" ) || open ( FD , "/proc/asound/sndstat" ) ) { $done = 0 ; while ( <FD> ) { if ( ! $done ) { print "Sound devices:\n" ; $nAudiodev = 0 ; $nSynthdev = 0 ; $nMIDIdev = 0 ; $nTimer = 0 ; $nMixer = 0 ; $done = 1 ; } if ( /^Audio devices:/ ) { while ( <FD> ) { if ( /^$/ ) { goto break1 ; } s/^[0-9]*:\s*// ; push @Audiodev , $_ ; $nAudiodev++ ; } break1: } if ( /^Synth devices:/ ) { while ( <FD> ) { if ( /^$/ ) { goto break2 ; } s/^[0-9]*:\s*// ; push @Synthdev , $_ ; $nSynthdev++ ; } break2: } if ( /^Midi devices:/ ) { while ( <FD> ) { if ( /^$/ ) { goto break3 ; } s/^[0-9]*:\s*// ; push @MIDIdev , $_ ; $nMIDIdev++ ; } break3: } if ( /^Timers:/ ) { while ( <FD> ) { if ( /^$/ ) { goto break4 ; } s/^[0-9]*:\s*// ; push @Timer , $_ ; $nTimer++ ; } break4: } if ( /^Mixers:/ ) { while ( <FD> ) { if ( /^$/ ) { goto break5 ; } s/^[0-9]*:\s*// ; push @Mixer , $_ ; $nMixer++ ; } break5: } } if ( $nAudiodev ) { printf ( " %d Audio device%s\n" , $nAudiodev , $nAudiodev > 1 ? "s" : "" ) ; while ( $val = shift @Audiodev ) { print " $val" ; } } if ( $nSynthdev ) { printf ( " %d Synth device%s\n" , $nSynthdev , $nSynthdev > 1 ? "s" : "" ) ; while ( $val = shift @Synthdev ) { print " $val" ; } } if ( $nMIDIdev ) { printf ( " %d MIDI device%s\n" , $nMIDIdev , $nMIDIdev > 1 ? "s" : "" ) ; while ( $val = shift @MIDIdev ) { print " $val" ; } } if ( $nTimer ) { printf ( " %d Timer%s\n" , $nTimer , $nTimer > 1 ? "s" : "" ) ; while ( $val = shift @Timer ) { print " $val" ; } } if ( $nMixer ) { printf " %d Mixer%s\n" , $nMixer , $nMixer > 1 ? "s" : "" ; while ( $val = shift @Mixer ) { print " $val" ; } } } open(FD, "/proc/pci"); $done = 0; while (<FD>) { if (/^\s*Bus/) { if ($done == 0) { print "PCI bus devices:\n"; $done++; } $_ = <FD>; print; } }