Subversion Repositories camp_sysinfo_client_3

Rev

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 );