lundi 29 mars 2010

Merging Essbase audit logs

If you always wanted to merge your Essbase audit files for quick troubleshooting then you may have a look at this Perl code.
 
 The Java version witch include a GUI is available here

#!/usr/bin/perl
#perl2exe_include "warnings.pm"

# Author: Sébastien Roux
# Mailto: roux.sebastien@gmail.com
# License: GPLv3, see attached license

# Modules include
use Getopt::Std;
use Strict;
use DirHandle;

# Set argument parameters
getopts( "i:o:d:f:h", \%opts ) or DisplayUsage();

# Verify arguments
DisplayHelp();
TestInputDirArg();
TestDateFormatArg();

$Directory = $opts{i};

# Open specified output file
if ( $opts{o} ) {
    open( OUTPUT, ">$opts{o}" )
      or die print "Error: could not open '$opts{o}'\n";
}

# Loop through specified directory
# get alg and order by date descendant
my %files = get_alg_Files($Directory);
#foreach my $file ( sort { $files{$b} <=> $files{$a} } keys %files ) {
foreach my $file ( sort keys %files ) {

    open( INPUT_ALG, $file )
      or die print "Error: could not open $file\n";

    $LCount = 1;

    while () {

        #First date/time row followed by "Create Spreadsheet Update Log" row
        if ( ( $LCount == 1 ) && (/^\[/) ) {
            chomp;
            $Line = $_;    # Current line

            # Header filtering
            unless ( $Line !~ /^.*$opts{f}.*$/ ) {

                # Change date format to specified style
                ChangeDateFormat();

                # File output
                if ( $opts{o} ) {
                    print OUTPUT "$Line\n";
                }

                # StdOut
                else {
                    print "$Line\n";
                }
            }
        }

        # First description row: "Create Spreadsheet Update Log"
        elsif ( ( $LCount == 2 ) && (/^Create/) ) {
            chomp;
            $Linedesc = $_;

            # Header filtering
            unless ( $Line !~ /^.*$opts{f}.*$/ ) {

                # File output
                if ( $opts{o} ) {
                    print OUTPUT "$Linedesc: $file\n\n";
                }

                # StdOut
                else {
                    print "$Linedesc: $file\n\n";
                }
            }
        }

        else {

            # Date/time row followed by "Log Updates"
            if (/^\[/) {
                chomp;
                $Line = $_;

                #$Line =~ s/[\[\]]// for 1 .. 2;
                ChangeDateFormat();
            }

            # Description row: "Log Updates From User"
            else {
                $LineD = $_;
                @desc = split / /, $LineD;

                #ChangeMonthString();

                # Date time and user
                $FullHeader = "$Line - @desc[5]";

                #print "$FullHeader\n";

                # Header filtering
                unless ( $FullHeader !~ /^.*$opts{f}.*$/ ) {

                    # File output
                    if ( $opts{o} ) {
                        print OUTPUT "$FullHeader\n";
                    }

                    # StdOut
                    else {
                        print "$FullHeader\n";
                    }

                    # First row of data logs (atx)
                    $frow = @desc[11];

                    # Last row of data logs (atx)
                    $lrow = ( @desc[11] + @desc[18] - 2 );

                    #print "First row: $frow, last row: $lrow\n";

                    # Matching rows in data logs (atx)
                    @data = ();

                    # Filename without extension
                    $file2 = substr( $file, 0, ( length($file) - 3 ) );

                    open( INPUT_ATX, $file2 . "atx" )
                      or die print "Error: could not open atx\n";
                    while () {
                        if ( $. >= $frow && $. <= $lrow ) {

                            #$_ =~ s/ /\t/g;
                            push( @data, $_ );
                        }
                    }
                    close(INPUT_ATX);

                    foreach (@data) {

                        # File output
                        if ( $opts{o} ) {
                            print OUTPUT "$_";
                        }

                        # StdOut
                        else {
                            print "$_";
                        }
                    }

                    # File output
                    if ( $opts{o} ) {
                        print OUTPUT "\n";
                    }

                    #StdOut output
                    else {
                        print "\n";
                    }
                }
            }
        }
        $LCount++;
    }
    close(INPUT_ALG);
}
close(OUTPUT);
exit;

#--------------------------------
sub DisplayHelp {

    if ( $opts{h} || @ARGV > 0 ) {
        print "DESCRIPTION :\n"
          . "Merge Essbase or Analytic Services (v.5 - v.9) SSAudit files (.ATX, .ATG)\n"
          . "from specified directory.\n"
          . "Options available : advanced date formatting, header filtering.\n";
        print "AUTHOR :\n"
          . "Written by Sebastien Roux \n";
        print "LICENSE :\n" . "GNU General Public License version 3 (GPLv3)\n";
        print "NOTES :\n"
          . "Use at your own risk !\n"
          . "You will be solely responsible for any damage\n"
          . "to your computer system or loss of data\n"
          . "that may result from the download\n"
          . "or the use of the following application/script.\n";
        DisplayUsage();
    }
}

#--------------------------------
sub DisplayUsage {

    print "\nUSAGE: perl SSAP . pl -i <.atx & .atg directory> "
      . "[-o , -d , -h]\n\n";
    print "USAGE: SSAP . exe -i <.atx & .atg directory> "
      . "[-o , -d , -h]\n\n";
    print "  -i   specify SSAudit log directory, arg: \n";
    print "  -o   specify output file, arg: \n";
    print "  -d   specify date format, arg: \n";
    print "  -f   specify filter on headers (case sensitive), arg: <*>\n";
    print "  -h   display usage\n";
    exit;
}

#--------------------------------
sub TestInputDirArg {

    my @i = split /;/, $opts{i};

    foreach $i (@i) {
        if ( !-d $i ) {
            print "Error: '$i' does not exists!\n";
            DisplayUsage();
        }
    }
}

#--------------------------------
sub TestDateFormatArg {

    if (   $opts{d}
        && ( uc( $opts{d} ) ne "ISO" )
        && ( uc( $opts{d} ) ne "EUR" )
        && ( uc( $opts{d} ) ne "US" ) )
    {
        print "Error: '$opts{d}' is not a valid argument for date format!";
        DisplayUsage();
    }
}

#--------------------------------
sub ChangeDateFormat {

    if ( $opts{d} ) {
        ChangeMonthString();

        $Line =~ s/[\[\]]// for 1 .. 2;

        my @g = split / /, $Line;
        $lastg = scalar(@g);

        # Set date format to ISO 8601 extended style (YYYY-MM-DD)
        if ( uc( $opts{d} ) eq "ISO" ) {
            $Line = "@g[4]/@g[1]/@g[2] @g[3]";
        }

        # Set date format to US style (MM/DD/YYYY)
        elsif ( uc( $opts{d} ) eq "US" ) {
            $Line = "@g[1]/@g[2]/@g[4] @g[3]";
        }

        # Set date format to European style (DD/MM/YYYY)
        elsif ( uc( $opts{d} ) eq "EUR" ) {
            $Line = "@g[2]/@g[1]/@g[4] @g[3]";
        }
    }
}

#--------------------------------
# Replace month label by month number
sub ChangeMonthString {

    my $MonthIndex;

    if ( $Line =~ m/(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)/ ) {
        if    ( lc($&) eq "jan" ) { $MonthIndex = "01"; }
        elsif ( lc($&) eq "feb" ) { $MonthIndex = "02"; }
        elsif ( lc($&) eq "mar" ) { $MonthIndex = "03"; }
        elsif ( lc($&) eq "apr" ) { $MonthIndex = "04"; }
        elsif ( lc($&) eq "may" ) { $MonthIndex = "05"; }
        elsif ( lc($&) eq "jun" ) { $MonthIndex = "06"; }
        elsif ( lc($&) eq "jul" ) { $MonthIndex = "07"; }
        elsif ( lc($&) eq "aug" ) { $MonthIndex = "08"; }
        elsif ( lc($&) eq "sep" ) { $MonthIndex = "09"; }
        elsif ( lc($&) eq "oct" ) { $MonthIndex = "10"; }
        elsif ( lc($&) eq "nov" ) { $MonthIndex = "11"; }
        elsif ( lc($&) eq "dec" ) { $MonthIndex = "12"; }
        $Line =~ s/$&/$MonthIndex/;
    }
}

#--------------------------------
sub TestDateFormatArg {

    if (   $opts{d}
        && ( uc( $opts{d} ) ne "ISO" )
        && ( uc( $opts{d} ) ne "EUR" )
        && ( uc( $opts{d} ) ne "US" ) )
    {
        print "Error: '$opts{d}' is not a valid argument for date format!";
        DisplayUsage();
    }
}

#--------------------------------
# List files an size for specified directory
sub get_alg_Files {

    my $dir = shift;
    my $dh  = DirHandle->new($dir);    #Cannot open directory $Directory: $!";
    return map { $_ => ( stat($_) )[9] }
      map      { "$dir$_" }
      grep     { m/.alg/i } $dh->read();
}
__END__

Aucun commentaire:

Enregistrer un commentaire

your comment here please!