#!/usr/bin/perl -w
require 5.003;
use strict;

# uses `lx' to extract various stats from polygraph binary logs
# assigns those stats a `label' for future reference
# see also: plot_results and report_results

if (`pwd` =~ 'ReportGen') {
	use lib '..';
}


use ReportGen::Opts;
use ReportGen::Globs;

# Configuration

my @ObjsToTrace = qw( 
	time req.rate rep.rate 
	cachable.ratio.obj
	offered.hit.ratio.obj offered.hit.ratio.byte
	hit.ratio.obj hit.ratio.byte
	rep.size.mean
	rep.rptm.mean hit.rptm.mean miss.rptm.mean
	fill.size.sum
	err_xact.ratio err_xact.count
	xact.level.mean wait.level.mean
	conn.open.level.mean conn.estb.level.mean 
	conn.open.started conn.estb.started
	conn.use.mean
	icp.req.rate icp.rep.rate
	icp.rep.rptm.mean icp.hit.rptm.mean icp.miss.rptm.mean
	icp.timeout.count
	duration
);

my %Opts = (
	log_extractor => undef(),
	log_extractor_opts => undef(),
	log_trace_extractor => undef(),
	log_trace_extractor_opts => undef(),
	log_dir => undef(),
	use_cache => undef(),
);
my %SavedOpts = %Opts;

# globals

my $Label;      # identifier for the logs
my @Logs = ();  # logs to label


&init();
exit(&main());

sub main {
	&extract($Opts{log_extractor}, 'clt.All', 
		$Opts{log_extractor_opts});
	&extract($Opts{log_trace_extractor}, 'clt.Traces', 
		$Opts{log_trace_extractor_opts}. 
		' --objects '. join(',', @ObjsToTrace));
	return 0;
}

sub extract {
	my ($lx, $groupName, $options) = @_;
	$options = '' unless defined $options;

	my $oname = &FullOutFName($Label, $groupName, '.lx');

	if (&upToDate($oname)) {
		warn("$0: `$oname' is up-to-date, using cached copy\n");
		return;
	}
	warn("$0: creating: `$oname'\n");

	my $cmd = sprintf("%s %s --out %s %s",
		$lx, $options,
		
		$oname, join(' ', @Logs));
	&System($cmd);
}


sub upToDate {
	my $fname = shift;

	return 0 unless $Opts{use_cache} =~ /^y(es)?$/i;

	return 0 unless -f $fname || -z $fname;
	my $fmt = (stat($fname))[9];
	return 0 unless $fmt;

	foreach my $log (@Logs) {
		my $logmt = (stat($log))[9];
		return 0 unless $logmt;
		return 0 if $logmt >= $fmt;
	}

	return 1;
}

sub init {
	my @anon;
	($Label, @Logs) = @anon if ParseOpts(\%Opts, \@anon, @ARGV);
	die("usage: $0 [options] <label> <log> ...\n" . &Opts2Str(\%SavedOpts))
		unless $Label && @Logs;
	@Logs = map { $Opts{log_dir}. "/$_" } @Logs if defined $Opts{log_dir};
}


syntax highlighted by Code2HTML, v. 0.9.1