#!/usr/bin/perl

use Date::Manip;

my $SCHEDULER_MONITOR='/var/log/pax-schedule.log';

open LOGFILE, ">$SCHEDULER_MONITOR" or die;
close LOGFILE;
sleep 30;

my %jobs = ();

open LOGFILE, $SCHEDULER_MONITOR or die;
while ( <LOGFILE> ) {
    chomp;
    my ($job_id, $task_id, $status, $timestamp, $duration, $flag,
        $where, $complex, $amount) = split /:/;
    next unless $job_id;

    $jobs{$job_id}{$task_id}{'chassis'} = $where if $flag eq 'P';
    $jobs{$job_id}{$task_id}{'slots'} = int($amount) if $flag eq 'P';

    next if exists $jobs{$job_id}{$task_id}{'status'};

    $jobs{$job_id}{$task_id}{'status'} = $status eq 'RUNNING' ? 'R' : 'W';
    $jobs{$job_id}{$task_id}{'starttime'} = ParseDateString("epoch $timestamp");
#print UnixDate($jobs{$job_id}{$task_id}{'starttime'}, "%d.%m. %H:%M"),"\n";
    my $end = $timestamp + $duration;
    $jobs{$job_id}{$task_id}{'end'} = ParseDateString("epoch $end");

    open QSTAT, "qstat -j $job_id |" or die;
    while ( <QSTAT> ) {
#	print;
	chomp;
	$jobs{$job_id}{$task_id}{'owner'} = $1 if /^owner:\s+(\S+)/;
	$jobs{$job_id}{$task_id}{'project'} = $1 if /^group:\s+(\S+)/;
	$jobs{$job_id}{$task_id}{'submission'} = ParseDate($1)
	    if /^submission_time:\s+(.*)/;
    }
    close QSTAT;
}
close LOGFILE;

my $format = "%6s %6s %8s %8s %3s %12s %12s %12s %4s %4s\n";

printf $format, 'JobID', 'TaskID', 'User', 'Project', 'St.', 'Submission', 'Start', 'End', 'Chas', 'Slots';
foreach my $job_id ( sort keys %jobs ) {
    foreach my $task_id ( sort keys %{$jobs{$job_id}} ) {
	printf $format,
	    $job_id,
	    $task_id,
	    $jobs{$job_id}{$task_id}{'owner'},
	    $jobs{$job_id}{$task_id}{'project'},
	    "$jobs{$job_id}{$task_id}{'status'} ",
	    UnixDate($jobs{$job_id}{$task_id}{'submission'}, "%d.%m./%H:%M"),
	    UnixDate($jobs{$job_id}{$task_id}{'starttime'}, "%d.%m./%H:%M"),
	    UnixDate($jobs{$job_id}{$task_id}{'end'}, "%d.%m./%H:%M"),
	    $jobs{$job_id}{$task_id}{'chassis'},
	    $jobs{$job_id}{$task_id}{'slots'};
    }
}
