gridengine/flex-grid/scripts/filter-accounting

125 lines
3.0 KiB
Perl
Executable File

#!/usr/bin/perl -w
use strict;
use Getopt::Std qw( getopts );
use Time::Local qw( timelocal );
my ($releaseDate) = qw( 2009-10-02 );
( my $Script = $0 ) =~ s{^.*/}{};
# -------------------------------------------------------------------------
sub usage {
$! = 0; # clean exit
warn "@_\n" if @_;
die <<"USAGE";
usage:
$Script [OPTION] file1 [ .. fileN ]
with options:
-b YYYY[-MM[-DD]]
begin date for accounting (job end_time > DATE 2 A.M.)
-e YYYY[-MM[-DD]]
end date for accounting (job end_time <= DATE 2 A.M.)
-h usage
Extract portions of the GridEngine accounting(5) file according to the
job end_time. For example,
$Script -b 2008-01-01 -e 2009 ...
extracts the accounting for jobs that finished running in 2008.
The value of 2 A.M. avoids problems that daylight savings time might
otherwise cause.
version ($releaseDate)
copyright (c) 2009 <Mark.Olesen\@faurecia.com>
Licensed and distributed under the Creative Commons
Attribution-NonCommercial-ShareAlike 3.0 License.
http://creativecommons.org/licenses/by-nc-sa/3.0
USAGE
}
# -------------------------------------------------------------------------
my %opt;
getopts( "hb:e:", \%opt ) or usage();
usage() if $opt{h};
@ARGV or usage();
for (@ARGV) {
-f $_ or die "no file '$_'\n";
## handle compressed files transparently
if (/\.bz2$/) {
$_ = qq{bzip2 -dc "$_"|};
}
elsif (/\.gz$/) {
$_ = qq{gzip -dc "$_"|};
}
}
for (qw( b e )) {
if ( $opt{$_} ||= 0 ) {
my ( $yy, $mm, $dd );
if ( $opt{$_} =~ /^(\d{2,4})-(\d{1,2})-(\d{1,2})$/ ) {
## YYYY-MM-DD
( $yy, $mm, $dd ) = ( $1, $2, $3 );
}
elsif ( $opt{$_} =~ /^(\d{2,4})-(\d{1,2})$/ ) {
## YYYY-MM
( $yy, $mm ) = ( $1, $2 );
}
elsif ( $opt{$_} =~ /^(\d{2,4})$/ ) {
## YYYY
($yy) = ($1);
}
else {
usage("invalid date format: '$opt{$_}'");
}
# treat missing month/day as '1'
$mm ||= 1;
$dd ||= 1;
# convert from YYYY-MM-DD to epoch,
# start at 2am - avoid problems with daylight savings time
$opt{$_} = timelocal( 0, 0, 2, $dd, $mm - 1, $yy ); # month (0..11)
}
}
$opt{b} or $opt{e} or usage("must specify at least one of -b or -e");
if ( $opt{e} and $opt{b} >= $opt{e} ) {
usage("-b DATE must less than -e DATE");
}
my $fileCount;
while (<>) {
if (/^\s*#/) {
## pass-thru comments, but only for the first file
print unless $fileCount;
next;
}
my ($endtime) = ( split /:/ )[10];
# only allow things that ran (endtime non-zero)
# and that are within the filter limits
if ( $endtime
and ( $opt{b} ? ( $endtime > $opt{b} ) : 'okay' )
and ( $opt{e} ? ( $endtime <= $opt{e} ) : 'okay' ) )
{
print;
}
}
continue {
$fileCount++ if eof;
}
__END__
FORMAT - see accounting(5)
08 submission_time
09 start_time
10 end_time