#!/usr/bin/perl -w

use strict;


sub cat {
  my ($file) = (@_);
  my ($line);
  open(FH1, $file) or die "Can't open $file: $!";

  while ( defined( $line = <FH1> ) ) {
    print $line;
  }
  
  close FH1;
}

sub min {
  my ($min1, $min2) = (@_);
  if ($min1 < $min2) {
    return $min1;
  }
  return $min2;
}

sub max {
  my ($max1, $max2) = (@_);
  if ($max1 > $max2) {
    return $max1;
  }
  return $max2;
}

sub kern {
  #nasty ordering hack that might just work....
  #Try to make sure 2.4.10 is indeed newer than 2.3.14
  my ($kern) = (@_);
  my ($a, $b, $c) = split (/\./, $kern);
  my ($d);
  if ($c =~ /.*-.*/) {
    $d = $c;
    $d =~ s/.*-//;
    $c =~ s/-.*//;
  }
  my $res = $c + $c*$b;
  $res = $res + $res*$a;
  if (defined($d)) {
    if ($d =~ /pre/) {
      #If the version is a -pre release, make sure it is moved up to top, because it is _not_ older than an e.g. -ac kernel.
      $d = "00" . $d;
    }
    $res = "$res" . $d;
  }
#  print "$kern, $a $b $c, $res\n";
  return $res;
}

sub mysort {
#Try to get the kernels is roughly the right order
  my @kernels = sort {kern($a) cmp kern($b)} @_;
  return @kernels;
}

my (@last, %kernels, @tmpfiles, %kernel, @kernel, @dtp, @dtps, @dirs);
my ($crap1, $crap2, $crap3, $kernel, $time1, $time2, $time3, $file);
my ($time4, $uptime, $i, $date, $tmpfile, $first, $datasofar);
my ($uptimeh, $uptimem, $uptimed, $min, $outfile, $max);
my ($maxuptime, $minuptime, $maxday, $yrange, $xrange);
my ($xmax, $ymax, $xmin, $ymin, $key, @list, $id, $ls,$pwd);

#$id=`id`;
#$ls=`ls -lA`;
#$pwd=`pwd`;
#print STDERR "id=$id; ls=$ls; pwd=$pwd\n";
chdir("/home/tconnors/public_html/systemstats/uptimes/") || die ("cant chdir()");


opendir DIR, ".";
@dirs = sort(readdir(DIR));
closedir DIR;
#$/=undef;
foreach $file (@dirs) {
  $kernel=$file;
  if (!($kernel =~ /^k\.(.*)\.txt$/)) {
    next;
  }
  $kernel=~ s/^k\.(.*)\.txt$/$1/;
#  print STDERR "kernel=$kernel\n";
  open(F,$file) || die ("can't open $file for reading");
  while (<F>) {
    chomp $_;
    my $sofar = $kernels{$kernel};
    if (defined $sofar) {
      $kernels{$kernel}="$sofar$_\n";
    } else {
      $kernels{$kernel}="$_\n";
    }
  }
#  print STDERR "\$kernels\{$kernel\}=$kernels{$kernel}";
  close F;
}
@last=`last|grep reboot`;
chomp @last;

$first=1;
foreach $i (@last) {
  ($crap1, $crap2, $crap3, $kernel, $time1, $time2, $time3, $time4, $uptime) = split (/  */, $i);
  $date=`date -d "$time1 $time2 $time3 $time4" "+%s"`;
  chomp $date;
  if ($first) {
    $min = $date;
  } else {
    $min = min($min, $date);
  }
  $first = 0;
}

$maxday = $minuptime = $maxuptime = 0;
foreach $i (@last) {
  ($crap1, $crap2, $crap3, $kernel, $time1, $time2, $time3, $time4, $uptime) = split (/  */, $i);
  $date=`date -d "$time1 $time2 $time3 $time4" "+%s"`;
  chomp $date;
  $date -= $min;
  $date = $date / (3600*24);
  $uptime =~ s/\((.*)\)/$1/;
  $uptimed = $uptimeh = $uptimem = $uptime;
  if ($uptimed =~ /\+/) {
    $uptimed =~ s/(.*)\+.*/$1/;
  } else {
    $uptimed = 0;
  }
  $uptimeh =~ s/.*(..):(..)/$1/;
  $uptimem =~ s/.*(..):(..)/$2/;

  $uptime = $uptimed + $uptimeh / 24 + $uptimem / (24*60);

  $date+= $uptime;
  $maxday = max($maxday, $date);
  $maxuptime = max($maxuptime, $uptime);
  $minuptime = min($minuptime, $uptime);


  $datasofar = $kernels{$kernel};
  if (!defined($datasofar)) {
    $kernels{$kernel} = "$date $uptime\n";
  } else {
    $kernels{$kernel} = "$datasofar$date $uptime\n";
  }

#  $dtp[0] = $date;
#  $dtp[1] = $uptime;
#  push ($kernels{$kernel}, @dtp);
#  print "foo: $date $uptime\n";
#  print "$kernels{$kernel}{$i}[0] $kernels{$kernel}{$i}[1]\n";
}

foreach $key (keys(%kernels)) {
  my $file="k.$key.txt";
  open (K, ">$file.1") || die ("cant open $file for writing");
  print K $kernels{$key};
  close K;
  system("sort  <$file.1 | uniq > $file");
  chmod (0666, $file);
  unlink("$file.1");
}

open (GNUPLOT, "|gnuplot") || die ("cant open gnuplot pipe");
#open (GNUPLOT, "|cat") || die ("cant open gnuplot pipe");
$i=1;
$outfile = "/tmp/graphuptime.$$";
$xrange = $xmax = $maxday;
$yrange = $ymax = $maxuptime;

$xmax = $xmax * (1.05);
$xmin = - $xrange / 20;
$ymax = $ymax * (1.2);
$ymin = - $yrange / 20;

print GNUPLOT "      set out \"$outfile.ps\"
      set xlabel \"date (days)\"
      set ylabel \"uptime (days)\"
      set title \"Uptime for scuzzie (updated on each load)\"
#      set size 1.7, 1.7
      set size 2.0, 1.0
      set terminal postscript portrait enhanced color \"Helvetica\" 20
#terminal png large color
      set xr [$xmin:$xmax]
      set yr [$ymin:$ymax]
plot ";
$first=1;
foreach $kernel (mysort(keys %kernels)) {
  $datasofar = $kernels{$kernel};
  if (!$first) {
    print GNUPLOT " , \\\n";
  }
  $tmpfile = "/tmp/graphuptime.$$.$i";
#  print "tmpfile=$tmpfile\n";
#  push @tmpfiles, $tmpfile;
  open(FH, ">>$tmpfile") || die ("cant open $tmpfile for writing");
  print FH "$datasofar";
  close FH;
  print GNUPLOT "\"$tmpfile\" title \"Linux $kernel\"";

  $i++;
  $first=0;
}
$max  = $i - 1;
print GNUPLOT "\n";
close GNUPLOT;


system("patch $outfile.ps < ../pscolorsoliddiff 1>&2 ; mogrify -format png $outfile.ps ; cat $outfile.png");

for ($i = 1 ; $i <= $max ; $i++) {
  $tmpfile = "/tmp/graphuptime.$$.$i";
  unlink $tmpfile;
}
unlink "$outfile.png";
unlink "$outfile.ps";
