#! /usr/bin/perl

use DateTime;
use DateTime::TimeZone;
use DateTime::Format::ISO8601;
use DateTime::Format::Strptime;

my $data_directory = "/var/www/localhost/htdocs/data";
my $directory = "/home/ftp";
my $name = "ntp";

$servers = `ntpq -pn`;
@servers = split /\n/, $servers;

my $addr; 	# IP address
my $refid;	# ?
my $stratum;	# Stratum
my $peertype;	# Local, Unicast, Multicast, Broadcast
my $last;	# Seconds passed after last packet from pear
my $poll;	# Poll interval in seconds
my $reach;	# Reachability flag (8 bits indicating if there response to last 8 queries)
my $roundtrip;	# Round trip message time to pear (ms)
my $diff;	# Difference between local clock and peer clock (ms)
my $disp;	# Variance of diff.

my $rootdelay;	# Round trip time to Stratum 0 server (ms)
my $rootdisp;	# Variance of this round-trip time (ms)

my $insync = 0;


my $isoparser = DateTime::Format::ISO8601->new();
my $gmt_timezone = DateTime::TimeZone->new(name=>'UTC');
my $xml_timezone = DateTime::TimeZone->new(name=>'local');


my $time = DateTime->now;

$time->set_time_zone($xml_timezone);
my $isotime = $time->strftime('%Y-%m-%dT%H:%M:%S.0000000%z');
$isotime =~ s/[+\-]0000$/Z/;
$isotime =~ s/([+\-]\d{2})(\d{2})$/\1:\2/;

$time->set_time_zone($gmt_timezone);

my $host = `hostname --fqdn`;

my $filename = $time->strftime('%Y%m%d');

chomp($host);
if ($host) { 
#    $name .= "-$host";
    $filename.="-$host.xml";
    $host=" host=\"$host\""; 
} else { 
    $filename.=".xml";
    $host=""; 
}




my $data = "<NTPData$host>\n";

$data .= " <Time>" . $isotime . "</Time>\n";
$data .= " <Value>\n";
$data .= "  <Servers>\n";
foreach $server(@servers) {
    if ($server =~ /^(#|\*|o|\+|\s)(p|~)?(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}.*)/) {
	($addr, $refid, $stratum, $peertype, $last, $poll, $reach, $roundtrip, $diff, $disp) = split /\s+/, $3;
	if ($stratum > 10) { next; }
	
	$data .= "   <Server ip=\"$addr\">\n";
	$data .= "    <Stratum>$stratum</Stratum>\n";
	$data .= "    <LastPolled>" . ($last) . "s</LastPolled>\n";
	$data .= "    <Distance>" . ($roundtrip) . "ms</Distance>\n";
	$data .= "    <Variance>" . ($disp) . "ms</Variance>\n";
	$data .= "   </Server>\n";
	
	if ($server =~ /^(#|\*|o|\+)/) { $insync = 1; }
    }
}
$data .= "  </Servers>\n";

if ($insync) {
    $status = `ntpq -c rv`;
    
    if ($status =~ /rootdelay=([\d.]+)/) { $rootdelay = int($1); }
    else { $insync = 0; }

    if ($status =~ /rootdispersion=([\d.]+)/) { $rootdelay = int($1); }
    else { $insync = 0; }

    if ($status =~ /offset=([\d.\-]+)/) { $diff = int($1); }
    else { $insync = 0; }
}

if ($insync) {
    $data .= "  <Status insync=\"true\">\n";
    $data .= "    <SyncError>" . ($diff) . "ms</SyncError>\n";
    $data .= "  </Status>\n";
} else {
    $data .= "  <Status insync=\"false\"/>\n";
}
$data .= " </Value>\n";

system("mkdir -p $directory/$name");
system("touch $data_directory/$name.xml");

open FILE, ">>$directory/$name/$filename";
print FILE "$data</NTPData>\n";
close FILE;
