]> git.ipfire.org Git - thirdparty/chrony.git/commitdiff
client: add ntpdata command
authorMiroslav Lichvar <mlichvar@redhat.com>
Fri, 25 Nov 2016 15:28:09 +0000 (16:28 +0100)
committerMiroslav Lichvar <mlichvar@redhat.com>
Fri, 25 Nov 2016 16:33:43 +0000 (17:33 +0100)
client.c
doc/chronyc.adoc

index ccf7a36aaaaa3b53603929d988b08174a62181d9..1be211e9234ff324646c3559bcdfa8c2b8564360 100644 (file)
--- a/client.c
+++ b/client.c
@@ -1193,6 +1193,7 @@ give_help(void)
     "\0\0"
     "NTP sources:\0\0"
     "activity\0Check how many NTP sources are online/offline\0"
+    "ntpdata <address>\0Display information about last valid measurement\0"
     "add server <address> [options]\0Add new NTP server\0"
     "add peer <address> [options]\0Add new NTP peer\0"
     "delete <address>\0Remove server or peer\0"
@@ -2193,6 +2194,83 @@ process_cmd_tracking(char *line)
 
 /* ================================================== */
 
+static int
+process_cmd_ntpdata(char *line)
+{
+  CMD_Request request;
+  CMD_Reply reply;
+  IPAddr remote_addr, local_addr;
+  struct timespec ref_time;
+
+  if (DNS_Name2IPAddress(line, &remote_addr, 1) != DNS_Success) {
+    LOG(LOGS_ERR, LOGF_Client, "Could not get address for hostname");
+    return 0;
+  }
+
+  request.command = htons(REQ_NTP_DATA);
+  UTI_IPHostToNetwork(&remote_addr, &request.data.ntp_data.ip_addr);
+  if (!request_reply(&request, &reply, RPY_NTP_DATA, 0))
+    return 0;
+
+  UTI_IPNetworkToHost(&reply.data.ntp_data.remote_addr, &remote_addr);
+  UTI_IPNetworkToHost(&reply.data.ntp_data.local_addr, &local_addr);
+  UTI_TimespecNetworkToHost(&reply.data.ntp_data.ref_time, &ref_time);
+
+  print_report("Remote address  : %s\n"
+               "Remote port     : %u\n"
+               "Local address   : %s\n"
+               "Leap status     : %L\n"
+               "Version         : %u\n"
+               "Mode            : %M\n"
+               "Stratum         : %u\n"
+               "Poll            : %u\n"
+               "Precision       : %.9f seconds\n"
+               "Root delay      : %.6f seconds\n"
+               "Root dispersion : %.6f seconds\n"
+               "Reference ID    : %R\n"
+               "Reference time  : %T\n"
+               "Offset          : %+.9f seconds\n"
+               "Peer delay      : %.9f seconds\n"
+               "Peer dispersion : %.9f seconds\n"
+               "Response time   : %.9f seconds\n"
+               "Jitter asymmetry: %+.2f\n"
+               "NTP tests       : %.3b %.3b %.4b\n"
+               "Interleaved     : %B\n"
+               "Authenticated   : %B\n"
+               "TX timestamping : %N\n"
+               "RX timestamping : %N\n"
+               "Total TX        : %U\n"
+               "Total RX        : %U\n"
+               "Total valid RX  : %U\n",
+               UTI_IPToString(&remote_addr), ntohs(reply.data.ntp_data.remote_port),
+               UTI_IPToString(&local_addr),
+               reply.data.ntp_data.leap, reply.data.ntp_data.version,
+               reply.data.ntp_data.mode, reply.data.ntp_data.stratum,
+               reply.data.ntp_data.poll, UTI_Log2ToDouble(reply.data.ntp_data.precision),
+               UTI_FloatNetworkToHost(reply.data.ntp_data.root_delay),
+               UTI_FloatNetworkToHost(reply.data.ntp_data.root_dispersion),
+               (unsigned long)ntohl(reply.data.ntp_data.ref_id), &ref_time,
+               UTI_FloatNetworkToHost(reply.data.ntp_data.offset),
+               UTI_FloatNetworkToHost(reply.data.ntp_data.peer_delay),
+               UTI_FloatNetworkToHost(reply.data.ntp_data.peer_dispersion),
+               UTI_FloatNetworkToHost(reply.data.ntp_data.response_time),
+               UTI_FloatNetworkToHost(reply.data.ntp_data.jitter_asymmetry),
+               ntohs(reply.data.ntp_data.flags) >> 7,
+               ntohs(reply.data.ntp_data.flags) >> 4,
+               ntohs(reply.data.ntp_data.flags),
+               ntohs(reply.data.ntp_data.flags) & RPY_NTP_FLAG_INTERLEAVED,
+               ntohs(reply.data.ntp_data.flags) & RPY_NTP_FLAG_AUTHENTICATED,
+               reply.data.ntp_data.tx_tss_char, reply.data.ntp_data.rx_tss_char,
+               (unsigned long)ntohl(reply.data.ntp_data.total_tx_count),
+               (unsigned long)ntohl(reply.data.ntp_data.total_rx_count),
+               (unsigned long)ntohl(reply.data.ntp_data.total_valid_count),
+               REPORT_END);
+
+  return 1;
+}
+
+/* ================================================== */
+
 static int
 process_cmd_serverstats(char *line)
 {
@@ -2809,6 +2887,9 @@ process_line(char *line)
     do_normal_submit = process_cmd_minpoll(&tx_message, line);
   } else if (!strcmp(command, "minstratum")) {
     do_normal_submit = process_cmd_minstratum(&tx_message, line);
+  } else if (!strcmp(command, "ntpdata")) {
+    do_normal_submit = 0;
+    ret = process_cmd_ntpdata(line);
   } else if (!strcmp(command, "offline")) {
     do_normal_submit = process_cmd_offline(&tx_message, line);
   } else if (!strcmp(command, "online")) {
index a3807b3b735c170092be43dd78376aa99559dc18..a49e156ac5f9df4eb9e611aa450e6cde5b246cc9 100644 (file)
@@ -441,6 +441,91 @@ the offline state.
 the name of the server or peer was not resolved to an address yet; this source is
 not visible in the *sources* and *sourcestats* reports.
 
+[[ntpdata]]*ntpdata* _address_::
+The *ntpdata* command displays the last valid measurement and other
+NTP-specific information about the NTP source. An example of the output is
+shown below.
++
+----
+Remote address  : 203.0.113.15
+Remote port     : 123
+Local address   : 203.0.113.74
+Leap status     : Normal
+Version         : 4
+Mode            : Server
+Stratum         : 1
+Poll            : 10
+Precision       : 0.000000060 seconds
+Root delay      : 0.000015 seconds
+Root dispersion : 0.000015 seconds
+Reference ID    : 50505331
+Reference time  : Fri Nov 25 15:22:12 2016
+Offset          : -0.000060878 seconds
+Peer delay      : 0.000175634 seconds
+Peer dispersion : 0.000000681 seconds
+Response time   : 0.000053050 seconds
+Jitter asymmetry: +0.00
+NTP tests       : 111 111 1111
+Interleaved     : No
+Authenticated   : No
+TX timestamping : Kernel
+RX timestamping : Kernel
+Total TX        : 24
+Total RX        : 24
+Total valid RX  : 24
+----
++
+The fields are explained as follows:
++
+*Remote address*:::
+The IP address of the NTP server or peer.
+*Remote port*:::
+The UDP port number to which the request was sent. The standard NTP port is
+123.
+*Local address*:::
+The local IP address which received the response.
+*Leap status*:::
+*Version*:::
+*Mode*:::
+*Stratum*:::
+*Poll*:::
+*Precision*:::
+*Root delay*:::
+*Root dispersion*:::
+*Reference ID*:::
+*Reference time*:::
+The NTP values from the last valid response.
+*Offset*:::
+*Peer delay*:::
+*Peer dispersion*:::
+The measured values.
+*Response time*:::
+The time the server or peer spent in processing of the request and waiting
+before sending the response.
+*Jitter asymmetry*:::
+The estimated asymmetry of network jitter on the path to the source. The
+asymmetry can be between -0.5 and 0.5. A negative value means the delay of
+packets sent to the source is more variable than the delay of packets sent
+from the source back.
+*NTP tests*:::
+Results of RFC 5905 tests 1 through 3, 5 through 7, and tests for maximum
+delay, delay ratio, delay dev ratio, and synchronisation loop.
+*Interleaved*:::
+This shows if the response was in the interleaved mode.
+*Authenticated*:::
+This shows if the response was authenticated.
+*TX timestamping*:::
+The source of the local transmit timestamp. Valid values are _Daemon_,
+_Kernel_, and _Hardware_.
+*RX timestamping*:::
+The source of the local receive timestamp.
+*Total TX*:::
+The number of packets sent to the source.
+*Total RX*:::
+The number of all packets received from the source.
+*Total valid RX*:::
+The number of valid packets received from the source.
+
 [[add_peer]]*add peer* _address_ [_option_]...::
 The *add peer* command allows a new NTP peer to be added whilst
 *chronyd* is running.