#!/usr/bin/perl

# v0.2 by alpha@Free-DC
# A simple script to parse all of your distributed.net proxyper OGRp2-25 log
# files and print some stats.
#
# v0.3.awesome by play0r and thebairyhum
# updated to provide html output and include user details

# I hope it doesn't break your computer. :)

use strict;
use warnings;
                
my $log_count = 0;
my $stub_count = 0;
my $total_nodes = 0;
my $largest = 0;
my $largest_date;
my $largest_year;
my $largest_month;
my $largest_day;
my $smallest = 999999999999;
my $smallest_date;
my $smallest_year;
my $smallest_month;
my $smallest_day;
my $average_nodes = 0;
my %user_gnodes;
my $overall_min;
my $overall_max;
my $file_tmp;
my %user_stubs;
my $uname;
my %uname_min;
my %uname_max;

#my @filelist = <./pproxyogrp2*.log> or die "No log files found.\n";
my @filelist = <./ogrp2*.log> or die "No log files found.\n";
print "This might take a while... please be patient.\n\n";
#$uname (sort keys %user_gnodes)

foreach $file_tmp (@filelist) {
  open (F_HANDLE, $file_tmp) or die $!;

  while (<F_HANDLE>) {
    my @columns = split(/,/, $_);
    # stub size in nodes
    my $nodes = $columns[4];

	my $catuname = $columns[2];
	$catuname = strip_email($catuname);
	
    # keep running overall total of nodes crunched
    $total_nodes = $total_nodes + $nodes;
    # divide by one billion to convert from nodes to Gnodes
    my $gnodes = $columns[4] / 1000000000;
	$user_gnodes{$catuname} += $gnodes;
    if ($gnodes > $largest) {
      $largest = $gnodes;
	  $overall_max = $catuname;
      $largest_date = $file_tmp;
    }
    if ($gnodes < $smallest) {
      $smallest = $gnodes;
	  $overall_min = $catuname;
      $smallest_date = $file_tmp;
    }
	if (not defined $uname_max{$catuname} ) {
		$uname_max{$catuname} = $gnodes;
	} elsif ($gnodes > $uname_max{$catuname} ) {
		$uname_max{$catuname} = $gnodes;
	}
	if (not defined $uname_min{$catuname} ) {
		$uname_min{$catuname} = $gnodes;
	} elsif ($gnodes < $uname_min{$catuname} ) {
		$uname_min{$catuname} = $gnodes;
	}

    # keep running overall total of stubs crunched
    $stub_count++;
	$user_stubs{$catuname}++;
  }  
    close F_HANDLE;
    # keep running overall total of number of log files (days)
    $log_count++;
}


($smallest_year, $smallest_month, $smallest_day) = $smallest_date =~ /ogrp2(\d{4})(\d\d)(\d\d)/;
($largest_year, $largest_month, $largest_day) = $largest_date =~ /ogrp2(\d{4})(\d\d)(\d\d)/;
$average_nodes = ($total_nodes / $stub_count) / 1000000000;

open F_HANDLE2, ">./bugjuice.html";

printf F_HANDLE2 qq{
<html>
<body style="background:#fff; font-family: tahoma, sans-serif, verdana; color: black; font-size: 12px;">
<p>Overall PProxy stats based on $log_count days and $stub_count stubs:</p>

<p>Smallest: %.3f Gnodes, submitted on $smallest_month/$smallest_day/$smallest_year by $overall_min</br>
Largest:  %.3f Gnodes, submitted on $largest_month/$largest_day/$largest_year by $overall_max</br>
Average:  %.3f Gnodes</br>
Total:    %.3f Gnodes</p>

<table style="font-size: 12px; border-collapse: collapse; border: solid 1px black;" cellpadding="3" cellspacing="5">
	<tr>
		<td align="center">User</td>
		<td align="center">Gnodes</td>
		<td align="center">Stubs</td>
		<td align="center">Smallest</td>
		<td align="center">Largest</td>
	</tr>
},$smallest,$largest,$average_nodes,$total_nodes /1000000000;
my $i = 0;
foreach $uname (sort keys %user_stubs) {
	if ($i %2 == 0) {
		print F_HANDLE2 "<tr bgcolor=\"#cecece\";>";
	} else {
		print F_HANDLE2 "<tr>";
	}
	$i++;

	printf F_HANDLE2 "<td align=\"left\">$uname</td> <td align=\"right\">%.3f</td> "
		. "<td align=\"right\">$user_stubs{$uname}</td> <td align=\"right\">%.3f</td> "
		. "<td align=\"right\">%.3f</td></tr>\n"
		, $user_gnodes{$uname}, $uname_min{$uname}, $uname_max{$uname}; 

}
print F_HANDLE2 "</table></br>";
my ($sec,$min,$hour,$mday,$mon,$year)=localtime(time);
printf F_HANDLE2 "Updated on %02d/%02d/%4d %02d:%02d:%02d\n",
$mon+1,$mday,$year+1900,$hour,$min,$sec;
print F_HANDLE2 "</body></html>";
close F_HANDLE2;

sub strip_email {
	my ($goldfish) = $_[0] =~ /(.+?)@/;
	#print $goldfish . "\n";
	return $goldfish;
}

sub stub_average {
	my ($neckbeard) = shift;
	my $total = 0;
	my $tea = 0;
	foreach my $hair (keys %$neckbeard) {
		$total += $neckbeard->{$hair};
		$tea++;
	}
	return ($total / $tea);
}

