Video Screencast Help
Symantec to Separate Into Two Focused, Industry-Leading Technology Companies. Learn more.

PERL Script: Parse the VCS Engine Log for messages related to an object over a number of hours

Created: 03 Dec 2010 • Updated: 12 Jan 2011 | 3 comments
Mark @ Veda's picture
+1 1 Vote
Login to vote

Description:

This script will look in the engine log for messages related to a cluster object that have occurred up to a certain number of hours ago.

==============================================================================
 
THE SCRIPT IS AS FOLLOWS
 

==============================================================================

 #!/usr/bin/perl
# 
# haloghist
# Written by Mark Gibson
# Version 1.0
#
# Usage:
# haloghist -help
# haloghist -res <resource> | -grp <group> | -sys <system> | -clus <cluster> -hoursago <hours>
#
#     <resource> is the name of a resource in the cluster
#     <system>   is the name of a system
#     <group>    is the name of a group
#     <cluster>  is the name of a cluster
#

use strict;
use Getopt::Long;
use Time::Local;

my $vcs_home = $ENV{"VCS_HOME"};
if (!defined ($vcs_home)) {
        $vcs_home="/opt/VRTSvcs";
}
#
# Global args
#
# Get the name of this script
my $me = $0;
$me =~ s|.*/||;
#
my $res = "";
my $grp = "";
my $sys = "";
my $clus = "";
my $hoursago = 0;
my $help = "";
my $options = "";

&usage_message() if (!defined $ARGV[0]);

$options = GetOptions ('res|r:s' => \$res,
                'grp|g:s' => \$grp,
                'sys|s:s' => \$sys,
                'clus|c:s' => \$clus,
                'hoursago|h=i' => \$hoursago,
                'help' => \$help);
#
# Print the usage message if invalid options
#
&usage_message() unless ($options);
#
# Print the usage message if requested
#
&usage_message() if ($help);
#
# Check that the object exists in the cluster
#
my @resout;
my @grpout;
my @sysout;
my @clusout;

if ( ${hoursago} < 1 ) {
        # Must specify a value greter than 0 for hoursago
        print("$me: Must specify an integer greater than 0 for hoursago\n");
        exit 1;
} elsif ( ${res} ne '' ) {
        # Check that resource $res exists
        @resout = `$vcs_home/bin/hares -display "${res}" > /dev/null 2>&1 `;
        if ( $? != 0 ) {
                print("$me: Resource ${res} does not exist\n");
                exit 1;
        }
} elsif ( $grp ne '' ) {
        # Check that group $grp exists
        @grpout = `$vcs_home/bin/hagrp -display "${grp}" >/dev/null 2>&1`;
        if ( $? != 0 ) {
                print("$me: Group ${grp} does not exist\n");
                exit 1;
        }
} elsif ( $sys ne '' ) {
        # Check that system $sys exists
        @sysout = `$vcs_home/bin/hasys -display "${sys}" >/dev/null 2>&1`;
        if ( $? != 0 ) {
                print("$me: System ${sys} does not exist\n");
                exit 1;
        }
} elsif ( $clus ne '' ) {
        # Check that cluster $clus exists
        @clusout = `$vcs_home/bin/haclus -display "${clus}" >/dev/null 2>&1`;
        if ( $? != 0 ) {
                print("$me: Cluster ${clus} does not exist\n");
                exit 1;
        }
} else {
        # No valid opton specified
        print("$me: No valid option specified\n");
        exit 1;
}
#
# Work out the time
#
my $secondsago = $hoursago * 3600;
my $currenttime = time;
my $starttime = $currenttime - $secondsago;
#
# Open the engine_A.log file. The engine_A.log is of the form:
# YYYY/MM/DD HH:MM:SS | VCS | Severity | UMI | Message Text
#
my $line="";
my $date="";
my $time="";
my $errorcode="";
my $errorstring="";
my @var;
my $enginelog = "/var/VRTSvcs/log/engine_A.log";

open( englogfile, "< $enginelog" ) || die ("\nerror: Failed to open $enginelog for reading ($!)\n\n");
my @logcontents = <englogfile>;
close(englogfile);

foreach $line (@logcontents) {
        chomp($line);
        if ($line =~ /^\d{4}\/\d{2}\/\d{2}/) {
        # Line starts with date so is valid
                @var = split(/\s+/, $line);
                $date = $var[0];
                $time = $var[1];
                $errorcode = $var[4];
                $errorstring = join(" ", @var[5..$#var]);
                # Convert date and time to epoch time
                my ($hours,$mins,$secs) = split /:/,$time;
                my ($years,$months,$days) = split /\//,$date;
                $months--;
                my $enginelogtime = timelocal($secs,$mins,$hours,$days,$months,$years);
                if ( $enginelogtime ge $starttime ) {
                        my $log_error = "";
                        if ( ${res} ne '' ) {
                                if ( $errorstring =~ /.$res./ ) {
                                        print("@var \n");
                                }
                        } elsif ( $grp ne '' ) {
                                if ( $errorstring =~ /.$grp./ ) {
                                         print("@var \n");
                                }
                        } elsif ( $sys ne '' ) {
                                if ( $errorstring =~ /.$sys./ ) {
                                        print("@var \n");
                                }
                        } elsif ( $clus ne '' ) {
                                if ( $errorstring =~ /.$clus./ ) {
                                        print("@var \n");
                                }
                        } else {
                        # No valid opton specified
                                print("$me: No valid option specified\n");
                                exit 1;
                        }
                }
        }
}

#
# Sub - usage message
#
sub usage_message {

        print "\n";
        print "Usage: $me -help\n";
        print "       $me -r <resource> | -g <group> | -s <system> | -c <cluster> -h <hours>\n\n";

        print "-r <resource>        Resource name\n";
        print "-g <group>           Group name\n";
        print "-s <system>          System name\n";
        print "-c <cluster>         Cluster name\n";
        print "-h <hoursago>        Number of hours to look back in the engine_A.log file\n";
        print "                     Must be a value greater than 0\n";
        exit 0;
}

Comments 3 CommentsJump to latest comment

sam321's picture

hi mark

very good script 

really helpful for me

thanks

kuldeeep

-1
Login to vote
Daniel Matheus's picture

Hi,

I thought it would be helpful to be able to specify the log file location.

Here is what I added:

# diff haloghist.pl haloghis-org.pl
39d38
< my $log = "";
48,49c47
<                 'help' => \$help,
<                 'log|l:s' => \$log);
---
>                 'help' => \$help);
65c63
< my @logout;
---
>
98,105d95
< } elsif ( $log ne '' ) {
<         # Check that log file $log exists
<         @logout = `if (-e $log )  >/dev/null 2>&1`;
<         if ( $? != 0 ) {
<                 print("$me: Logfile  ${log} does not exist\n");
<                 exit 1;
<         }
<
127c117
< my $enginelog = $log || "/var/VRTSvcs/log/engine_A.log";
---
> my $enginelog = "/var/VRTSvcs/log/engine_A.log";
189d178
<         print "-l <logfile>         Location of the logfile (default:/var/VRTS                                                                                                             vcs/log/engine_A.log) \n";
 

And here the full script:

 #!/usr/bin/perl
#
# haloghist
# Written by Mark Gibson
# Version 1.0
#
# Usage:
# haloghist -help
# haloghist -res <resource> | -grp <group> | -sys <system> | -clus <cluster> -hoursago <hours>
#
#     <resource> is the name of a resource in the cluster
#     <system>   is the name of a system
#     <group>    is the name of a group
#     <cluster>  is the name of a cluster
#

use strict;
use Getopt::Long;
use Time::Local;

my $vcs_home = $ENV{"VCS_HOME"};
if (!defined ($vcs_home)) {
        $vcs_home="/opt/VRTSvcs";
}
#
# Global args
#
# Get the name of this script
my $me = $0;
$me =~ s|.*/||;
#
my $res = "";
my $grp = "";
my $sys = "";
my $clus = "";
my $hoursago = 0;
my $help = "";
my $options = "";
my $log = "";

&usage_message() if (!defined $ARGV[0]);

$options = GetOptions ('res|r:s' => \$res,
                'grp|g:s' => \$grp,
                'sys|s:s' => \$sys,
                'clus|c:s' => \$clus,
                'hoursago|h=i' => \$hoursago,
                'help' => \$help,
                'log|l:s' => \$log);
#
# Print the usage message if invalid options
#
&usage_message() unless ($options);
#
# Print the usage message if requested
#
&usage_message() if ($help);
#
# Check that the object exists in the cluster
#
my @resout;
my @grpout;
my @sysout;
my @clusout;
my @logout;
if ( ${hoursago} < 1 ) {
        # Must specify a value greter than 0 for hoursago
        print("$me: Must specify an integer greater than 0 for hoursago\n");
        exit 1;
} elsif ( ${res} ne '' ) {
        # Check that resource $res exists
        @resout = `$vcs_home/bin/hares -display "${res}" > /dev/null 2>&1 `;
        if ( $? != 0 ) {
                print("$me: Resource ${res} does not exist\n");
                exit 1;
        }
} elsif ( $grp ne '' ) {
        # Check that group $grp exists
        @grpout = `$vcs_home/bin/hagrp -display "${grp}" >/dev/null 2>&1`;
        if ( $? != 0 ) {
                print("$me: Group ${grp} does not exist\n");
                exit 1;
        }
} elsif ( $sys ne '' ) {
        # Check that system $sys exists
        @sysout = `$vcs_home/bin/hasys -display "${sys}" >/dev/null 2>&1`;
        if ( $? != 0 ) {
                print("$me: System ${sys} does not exist\n");
                exit 1;
        }
} elsif ( $clus ne '' ) {
        # Check that cluster $clus exists
        @clusout = `$vcs_home/bin/haclus -display "${clus}" >/dev/null 2>&1`;
        if ( $? != 0 ) {
                print("$me: Cluster ${clus} does not exist\n");
                exit 1;
        }
} elsif ( $log ne '' ) {
        # Check that log file $log exists
        @logout = `if (-e $log )  >/dev/null 2>&1`;
        if ( $? != 0 ) {
                print("$me: Logfile  ${log} does not exist\n");
                exit 1;
        }

} else {
        # No valid opton specified
        print("$me: No valid option specified\n");
        exit 1;
}
#
# Work out the time
#
my $secondsago = $hoursago * 3600;
my $currenttime = time;
my $starttime = $currenttime - $secondsago;
#
# Open the engine_A.log file. The engine_A.log is of the form:
# YYYY/MM/DD HH:MM:SS | VCS | Severity | UMI | Message Text
#
my $line="";
my $date="";
my $time="";
my $errorcode="";
my $errorstring="";
my @var;
my $enginelog = $log || "/var/VRTSvcs/log/engine_A.log";

open( englogfile, "< $enginelog" ) || die ("\nerror: Failed to open $enginelog for reading ($!)\n\n");
my @logcontents = <englogfile>;
close(englogfile);

foreach $line (@logcontents) {
        chomp($line);
        if ($line =~ /^\d{4}\/\d{2}\/\d{2}/) {
        # Line starts with date so is valid
                @var = split(/\s+/, $line);
                $date = $var[0];
                $time = $var[1];
                $errorcode = $var[4];
                $errorstring = join(" ", @var[5..$#var]);
                # Convert date and time to epoch time
                my ($hours,$mins,$secs) = split /:/,$time;
                my ($years,$months,$days) = split /\//,$date;
                $months--;
                my $enginelogtime = timelocal($secs,$mins,$hours,$days,$months,$years);
                if ( $enginelogtime ge $starttime ) {
                        my $log_error = "";
                        if ( ${res} ne '' ) {
                                if ( $errorstring =~ /.$res./ ) {
                                        print("@var \n");
                                }
                        } elsif ( $grp ne '' ) {
                                if ( $errorstring =~ /.$grp./ ) {
                                         print("@var \n");
                                }
                        } elsif ( $sys ne '' ) {
                                if ( $errorstring =~ /.$sys./ ) {
                                        print("@var \n");
                                }
                        } elsif ( $clus ne '' ) {
                                if ( $errorstring =~ /.$clus./ ) {
                                        print("@var \n");
                                }
                        } else {
                        # No valid opton specified
                                print("$me: No valid option specified\n");
                                exit 1;
                        }
                }
        }
}

#
# Sub - usage message
#
sub usage_message {

        print "\n";
        print "Usage: $me -help\n";
        print "       $me -r <resource> | -g <group> | -s <system> | -c <cluster> -h <hours>\n\n";

        print "-r <resource>        Resource name\n";
        print "-g <group>           Group name\n";
        print "-s <system>          System name\n";
        print "-c <cluster>         Cluster name\n";
        print "-h <hoursago>        Number of hours to look back in the engine_A.log file\n";
        print "                     Must be a value greater than 0\n";
        print "-l <logfile>         Location of the logfile (default:/var/VRTSvcs/log/engine_A.log) \n";
        exit 0;
}
 

If this post has helped you, please vote or mark as solution

-1
Login to vote
arangari's picture

are you trying to capture the history for a specific object?

Thanks and Warm Regards,

Amit Rangari

If this post helped you resolving the issue, please mark it as solution. _____________________________________________________________________________

-1
Login to vote