Subversion Repositories camp_sysinfo_client_3

Rev

Rev 251 | 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';

# Template for modules to be used in sysinfo
# Author: R. W. Rodolico
# Date:   2025-04-02
#
# Description: get information on md (RAID)
#
# 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 = {
        'mdadm' => undef,
        'fdisk' => 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 = 'diskinfo';

#####
##### 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
   #####
   
   if ( -e '/proc/mdstat' ) {
      open MD,'</proc/mdstat' or exit 1;
      my @temp = <MD>;
      close MD;

      while ( my $line = shift @temp ) {
         chomp $line;
         if ( $line =~ m/^(md\d+)\s+:\s+(.*)$/ ) {
            my $device = $1;
            my @components = split( /\s+/, $2 );
            shift @components;
            push @out, "$CATEGORY\t$device\tlevel\t" . shift(@components);
            push @out, "$CATEGORY\t$device\tcomponents\t" . join( " ", @components );
            my $temp = qx( mdadm --detail /dev/$device | grep 'Array Size' | cut -d':' -f2 | cut -d' ' -f2 );
            chomp $temp;
            push @out, "$CATEGORY\t$device\tsize\t$temp";
         }
      }
   }

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