Rev 251 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
#!/usr/bin/env perl
use warnings;
use strict;
use version ; our $VERSION = 'v1.0.0';
# Gets PCI information on BSD systems
# Author: R. W. Rodolico
# Date: 2016-04-08
#
# gets information on pci information assuming lspci is installed
# I really don't remember how I wrote this originally, so I just put everything
# into the hash (as done in v2), then print the hash. Unneccessarily wasteful of memory
#
# Revision History
#
#
# find our location and use it for searching for libraries. library.pm must be in the same directory as the calling script
# or, if run interactively, in the parent of the modules
BEGIN {
use FindBin;
use File::Spec;
# prepend the bin directory and its parent
use lib File::Spec->catdir($FindBin::Bin), File::Spec->catdir("$FindBin::Bin/..");
eval( 'use library;' );
die sprintf( "Could not find library.pm in %s, INC is %s\n", __FILE__, join( "\n", @INC ) ) if $@;
}
#####
##### Change these to match your needs
#####
# Make this a list of all the modules we are going to use. You can replace undef with the version you need, if you like
my $modulesList = {
'Data::Dumper' => undef,
};
# hash of commands that are needed for the system. key is the name of the command and, in some cases, the value will become
# the full path (from which or where)
my $commandsList = {
'pciconfig' => undef,
};
# list of operating systems this module can be used on.
my $osList = {
# 'mswin32' => undef,
'freebsd' => undef,
# 'linux' => undef,
};
# the category the return data should go into. See sysinfo for a list
my $CATEGORY = 'pci';
#####
##### End of required
#####
# some variables needed for our system
my $errorPrepend = 'error: in ' . __FILE__; # this is prepended to any error messages
my @out; # temporary location for each line of output
# Try to load the modules we need. If we can not, then make a list of missing modules for error message.
for my $module ( keys %$modulesList ) {
eval ( "use $module;" );
push @out, "$errorPrepend Could not load $module" if $@;
}
if ( ! @out && ! checkOS ( $osList ) ) { # check if we are on an acceptible operating system
push @out, "$errorPrepend Invalid Operating System";
}
if ( !@out && ! validCommandOnSystem ( $commandsList ) ) {
push @out, "$errorPrepend Can not find some commands needed";
}
if ( !@out ) { # we made it, we have everything, so do the processing
#####
##### Your code starts here. Remember to push all output onto @out
#####
my @pciInfo = qx( pciconfig -lv);
my %returnValue;
chomp @pciInfo;
my $slot = '';
while ( my $line = shift( @pciInfo ) ) {
if ( $line =~ m/^([^@]+)\@([^ ]+)\s+class=([^ ]+)\s+card=([^ ]+)\s+chip=([^ ]+)\s+rev=([^ ]+)\s+hdr=(.+)$/ ) {
$slot = $2;
$returnValue{$slot}{'driver'} = $1;
$returnValue{$slot}{'class'} = $3;
$returnValue{$slot}{'card'} = $4;
$returnValue{$slot}{'chip'} = $5;
$returnValue{$slot}{'revision'} = $6;
$returnValue{$slot}{'header'} = $7;
} else {
my ($key, $value ) = split( '=', $line );
$returnValue{$slot}{&cleanUp( ' ', $key )} = &cleanUp( ' ', $value );
}
}
foreach my $key ( sort keys %returnValue ) {
my $temp = $returnValue{$key};
foreach my $info ( keys %$temp ) {
push @out, "$CATEGORY\t$key\t$info\t" . $$temp{$info};
}
}
#####
##### Your code ends here.
#####
}
# If we are testing from the command line (caller is undef), print the results for debugging
print join( "\n", @out ) . "\n" unless caller;
# called by do, which has a value of the last assignment made, so make the assignment. The equivilent of a return
my $return = join( "\n", @out );