1*179b1225Skardel#!/bin/sh 2*179b1225Skardel 3*179b1225Skardel/usr/bin/awk ' 4*179b1225Skardel# 5*179b1225Skardel# Based on a perl script by 6*179b1225Skardel# John Hay -- John.Hay@icomtek.csir.co.za / jhay@FreeBSD.org 7*179b1225Skardel# 8*179b1225Skardel# awk version by Frederick Bruckman <bruckman@ntp.org> 9*179b1225Skardel 10*179b1225Skardel 11*179b1225Skardelfunction usage() { 12*179b1225Skardel print "usage: ntptrace [-nv] [-r retries] [host]" 13*179b1225Skardel exit 1 14*179b1225Skardel} 15*179b1225Skardel 16*179b1225Skardelfunction getargs( command, i, argc, argv, done) { 17*179b1225Skardel host = "localhost." 18*179b1225Skardel retries = 1 19*179b1225Skardel 20*179b1225Skardel command = "getopt nr:v" 21*179b1225Skardel for (i = 2; i <= ARGC; i++) 22*179b1225Skardel command = command " " ARGV[i-1] 23*179b1225Skardel command | getline 24*179b1225Skardel argc = split($0, argv) 25*179b1225Skardel for (i = 1; i <= argc; i++) { 26*179b1225Skardel if (argv[i] == "-n") use_numeric = 1 27*179b1225Skardel if (argv[i] == "-v") do_verbose = 1 28*179b1225Skardel if (argv[i] == "-r") retries = argv[++i] 29*179b1225Skardel if (done == 1) host = argv[i] 30*179b1225Skardel if (argv[i] == "--") done = 1 31*179b1225Skardel } 32*179b1225Skardel 33*179b1225Skardel if (retries != retries + 0) 34*179b1225Skardel usage() 35*179b1225Skardel} 36*179b1225Skardel 37*179b1225Skardelfunction do_one_server( command, i, nvars, vars, stratum, peer, offset, 38*179b1225Skardel rootdelay, rootdispersion, refid, srcadr) { 39*179b1225Skardel rootdelay = 0 40*179b1225Skardel rootdispersion = 0 41*179b1225Skardel srcadr = "" 42*179b1225Skardel stratum = 255 43*179b1225Skardel 44*179b1225Skardel command = "ntpq -n -c rv " host 45*179b1225Skardel while (command | getline) { 46*179b1225Skardel gsub(/,/,"") 47*179b1225Skardel nvars = split($0, vars) 48*179b1225Skardel for (i = 1; i <= nvars; i++) { 49*179b1225Skardel if (vars[i] ~ /stratum=/) { 50*179b1225Skardel stratum = vars[i] 51*179b1225Skardel sub(/stratum=/, "", stratum) 52*179b1225Skardel } 53*179b1225Skardel if (vars[i] ~ /peer=/) { 54*179b1225Skardel peer = vars[i] 55*179b1225Skardel sub(/peer=/, "", peer) 56*179b1225Skardel } 57*179b1225Skardel if (vars[i] ~ /offset=/) { 58*179b1225Skardel offset = vars[i] 59*179b1225Skardel sub(/offset=/, "", offset) 60*179b1225Skardel } 61*179b1225Skardel if (vars[i] ~ /phase=/) { 62*179b1225Skardel offset = vars[i] 63*179b1225Skardel sub(/phase=/, "", offset) 64*179b1225Skardel } 65*179b1225Skardel if (vars[i] ~ /rootdelay=/) { 66*179b1225Skardel rootdelay = vars[i] 67*179b1225Skardel sub(/rootdelay=/, "", rootdelay) 68*179b1225Skardel } 69*179b1225Skardel if (vars[i] ~ /rootdispersion=/) { 70*179b1225Skardel rootdispersion = vars[i] 71*179b1225Skardel sub(/rootdispersion=/, "", rootdispersion) 72*179b1225Skardel } 73*179b1225Skardel if (vars[i] ~ /refid=/) { 74*179b1225Skardel refid = vars[i] 75*179b1225Skardel sub(/refid=/, "", refid) 76*179b1225Skardel } 77*179b1225Skardel } 78*179b1225Skardel } 79*179b1225Skardel 80*179b1225Skardel if (stratum == 255) 81*179b1225Skardel exit 1 82*179b1225Skardel 83*179b1225Skardel offset = offset / 1000 84*179b1225Skardel syncdistance = (rootdispersion + (rootdelay / 2)) / 1000 85*179b1225Skardel 86*179b1225Skardel printf("%s: stratum %d, offset %f, synch distance %f", 87*179b1225Skardel dhost(host), stratum, offset, syncdistance) 88*179b1225Skardel if (stratum == 1) printf(", refid '\''%s'\''", refid) 89*179b1225Skardel printf("\n") 90*179b1225Skardel 91*179b1225Skardel if (stratum == 0 || stratum == 1 || stratum == 16) 92*179b1225Skardel exit 0 93*179b1225Skardel if (refid ~ /127\.127\.[0-9]{1,3}\.[0-9]{1,3}/) 94*179b1225Skardel exit 0 95*179b1225Skardel 96*179b1225Skardel command = "ntpq -n -c '\''pstat " peer "'\'' " host 97*179b1225Skardel while (command | getline) { 98*179b1225Skardel gsub(/,/,"") 99*179b1225Skardel nvars = split($0, vars) 100*179b1225Skardel for (i = 1; i <= nvars; i++) { 101*179b1225Skardel if (vars[i] ~ /srcadr=/) { 102*179b1225Skardel srcadr = vars[i] 103*179b1225Skardel sub(/srcadr=/, "", srcadr) 104*179b1225Skardel } 105*179b1225Skardel } 106*179b1225Skardel } 107*179b1225Skardel 108*179b1225Skardel if (srcadr ~ /127\.127\.[0-9]{1,3}\.[0-9]{1,3}/ || srcadr == "") 109*179b1225Skardel exit 0 110*179b1225Skardel 111*179b1225Skardel host = srcadr 112*179b1225Skardel do_one_server() 113*179b1225Skardel} 114*179b1225Skardel 115*179b1225Skardelfunction dhost(myhost, command) { 116*179b1225Skardel command = "host " myhost 117*179b1225Skardel while (command | getline) { 118*179b1225Skardel if (use_numeric) { 119*179b1225Skardel if (/address/) return $NF 120*179b1225Skardel } else { 121*179b1225Skardel if (/pointer/) return $NF 122*179b1225Skardel } 123*179b1225Skardel } 124*179b1225Skardel return myhost 125*179b1225Skardel} 126*179b1225Skardel 127*179b1225SkardelBEGIN { 128*179b1225Skardel getargs() 129*179b1225Skardel do_one_server() 130*179b1225Skardel} 131*179b1225Skardel' $@ 132