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


require Net::Ping;
require Time::HiRes;

my $host = "myhost.com"; #Host to ping

my $datafile = "data"; #Datafile to write all datapoints to (leave blank for none).
			# Warning: this thing can get really big.
			# Format: <delay in ms>:<unix timestamp>\n

my $logfile = "log";     #File to log (High/Low) Lag Times to.


my $lowlagmin = 300;   #Tweek these settings to change the detection settings
my $lowlagmax = 800;
my $highlagmin = 700;

my $delay = 5;  #delay between datapoints (sec.)

my $lagstep = 6;  #number of steps before lag change sence (kinda like a transmission.)
my $oldh;

if($datafile){
	if(!open(DATAFILE,">>$datafile")){
		print "Warning: Couldn\'t open $datafile. We won\'t log.\n";
		$datafile = "";
		}
	$oldh = select(DATAFILE); # here set the filehandle to immediate write.
	$|=1;
	select($oldh);
	}

if($logfile){
	if(!open(LOGFILE,">>$logfile")){
		print "Warning: Couldn\'t open $logfile. We won\'t log.\n";
		$logfile = "";
		}
	$oldh = select(LOGFILE); # here set the filehandle to immediate write.
	$|=1;
	select($oldh);
	}


my $p = Net::Ping->new();
$p->hires();

my ($ret, $duration, $ip); 
my @lag;
my $clag=0;
my $cnt=0;
my ($i,$flag);

while(1){
	($ret, $duration, $ip) = $p->ping($host, 5.5);
	$duration = int($duration*1000);
	if($datafile){print DATAFILE "$duration:".time()."\n";}	
	
	if($logfile){
		if($cnt < $lagstep){push(@lag,$duration);$cnt++;}
		else{
			shift(@lag);
			push(@lag,$duration);
			# print " $duration ($lag[0],$lag[1],$lag[2],$lag[3],$lag[4],$lag[5]) $clag\n";
			# Now Figure out if the lag array warrents a change in clag.
			if($clag == 0){
				$flag=0;
				foreach $i (@lag){
					if ($i < $lowlagmin){
						$flag=1;
						last();
						}
					}
				if(!$flag){ # here we have at least low lag
					$flag=0;
					foreach $i (@lag){
						if ($i > $lowlagmax){
							$flag=1;
							last();
							}
						}
					if($flag){ #high lag
						print LOGFILE time()."\tHigh Lag\n";
						$clag=2;
						}
					else{ #Low Lag
						print LOGFILE time()."\tLow Lag\n";
						$clag=1;
						}
					}
				}
			elsif($clag == 1){
				$flag=0;
				foreach $i (@lag){
					if ($i > $lowlagmin){
						$flag=1;
						last();
						}
					}
				
				if(!$flag){ #No Lag
					print LOGFILE time()."\tNo Lag\n";
					$clag=0;
					}
				else{ 
					$flag=0;
					foreach $i (@lag){
						if ($i < $lowlagmax){
							$flag=1;
							last();
							}
						}
						if(!$flag){ #High Lag
						print LOGFILE time()."\tHigh Lag\n";
						$clag=2;
						}
					}
				
				}
			elsif($clag == 2){
				$flag=0;
				foreach $i (@lag){
					if ($i > $lowlagmin){
						$flag=1;
						last();
						}
					}
				
				if(!$flag){ #No Lag
					print LOGFILE time()."\tNo Lag\n";
					$clag=0;
					}
				else{ 
					$flag=0;
					foreach $i (@lag){
						if ($i > $highlagmin){
							$flag=1;
							last();
							}
						}
						if(!$flag){ #Low Lag
						print LOGFILE time()."\tLow Lag\n";
						$clag=1;
						}
					}
				}
			else{# clag is wrong
				print "clag error\n";
				$clag = 0;
				}
					
			}
		}
	
	sleep($delay);
	}

# Yeah, I know this'll never execute but I put it here incase i ever rewrite some stuff.
if($datafile){close(DATAFILE);}
if($logfile){close(LOGFILE);}
$p->close();
