File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / ntp / scripts / ntptrace.in
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue May 29 12:08:38 2012 UTC (12 years, 1 month ago) by misho
Branches: ntp, MAIN
CVS tags: v4_2_6p5p0, v4_2_6p5, HEAD
ntp 4.2.6p5

    1: #! @PATH_PERL@ -w
    2: 
    3: # John Hay -- John.Hay@icomtek.csir.co.za / jhay@FreeBSD.org
    4: 
    5: use Socket;
    6: use Getopt::Std;
    7: use vars qw($opt_n $opt_m);
    8: 
    9: $ntpq = "ntpq";
   10: 
   11: $Getopt::Std::STANDARD_HELP_VERSION=1;
   12: getopts('nm:');
   13: 
   14: $dodns = 1;
   15: $dodns = 0 if (defined($opt_n));
   16: 
   17: $max_hosts = (defined($opt_m) ? $opt_m :  99);
   18: $max_hosts = 0 if ( $max_hosts !~ /^\d+$/ );
   19: $nb_host = 1;
   20: 
   21: $host = shift;
   22: $host ||= "127.0.0.1";
   23: 
   24: for (;;) {
   25: 	$nb_host++;
   26: 	$rootdelay = 0;
   27: 	$rootdispersion = 0;
   28: 	$stratum = 255;
   29: 	$cmd = "$ntpq -n -c rv $host";
   30: 	open(PH, $cmd . "|") || die "failed to start command $cmd: $!";
   31: 	while (<PH>) {
   32: 		$stratum = $1 if (/stratum=(\d+)/);
   33: 		$peer = $1 if (/peer=(\d+)/);
   34: 		# Very old servers report phase and not offset.
   35: 		$offset = $1 if (/(?:offset|phase)=([^\s,]+)/);
   36: 		$rootdelay = $1 if (/rootdelay=([^\s,]+)/);
   37: 		$rootdispersion = $1 if (/rootdispersion=([^\s,]+)/);
   38: 		$refid = $1 if (/refid=([^\s,]+)/);
   39: 	}
   40: 	close(PH) || die "$cmd failed";
   41: 	last if ($stratum == 255);
   42: 	$offset /= 1000;
   43: 	$syncdistance = ($rootdispersion + ($rootdelay / 2)) / 1000;
   44: 	$dhost = $host;
   45: 	# Only do lookups of IPv4 addresses. The standard lookup functions
   46: 	# of perl only do IPv4 and I don't know if we should require extras.
   47: 	if ($dodns && $host =~ /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/) {
   48: 		$iaddr = inet_aton($host);
   49: 		$name = (gethostbyaddr($iaddr, AF_INET))[0];
   50: 		$dhost = $name if (defined($name));
   51: 	}
   52: 	printf("%s: stratum %d, offset %f, synch distance %f",
   53: 	    $dhost, $stratum, $offset, $syncdistance);
   54: 	printf(", refid '%s'", $refid) if ($stratum == 1);
   55: 	printf("\n");
   56: 	last if ($stratum == 0 || $stratum == 1 || $stratum == 16);
   57: 	last if ($refid =~ /^127\.127\.\d{1,3}\.\d{1,3}$/);
   58: 	last if ($nb_host > $max_hosts);
   59: 
   60: 	$cmd = "$ntpq -n -c \"pstat $peer\" $host";
   61: 	open(PH, $cmd . "|") || die "failed to start command $cmd: $!";
   62: 	$thost = "";
   63: 	while (<PH>) {
   64: 		$thost = $1, last if (/srcadr=(\S+),/);
   65: 	}
   66: 	close(PH) || die "$cmd failed";
   67: 	last if ($thost eq "");
   68: 	last if ($thost =~ /^127\.127\.\d{1,3}\.\d{1,3}$/);
   69: 	$host = $thost;
   70: }
   71: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>