xref: /netbsd-src/external/bsd/ntp/bin/ntptrace/ntptrace.awk (revision 179b12252ecaf3553d9c2b7458ce62b6a2203d0c)
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