Home | History | Annotate | Line # | Download | only in sntp
      1      1.1    kardel /* -*- Mode: Text -*- */
      2      1.1    kardel 
      3      1.1    kardel autogen definitions options;
      4      1.1    kardel 
      5      1.1    kardel #include autogen-version.def
      6      1.1    kardel #include copyright.def
      7      1.1    kardel 
      8      1.1    kardel prog-name      = "sntp";
      9  1.1.1.3  christos prog-title	= "standard Simple Network Time Protocol client program";
     10  1.1.1.2    kardel argument	= '[ hostname-or-IP ...]';
     11  1.1.1.2    kardel 
     12  1.1.1.2    kardel #include homerc.def
     13      1.1    kardel 
     14      1.1    kardel long-opts;
     15      1.1    kardel 
     16  1.1.1.3  christos config-header	= "config.h";
     17      1.1    kardel 
     18      1.1    kardel environrc;
     19      1.1    kardel 
     20      1.1    kardel #include version.def
     21      1.1    kardel 
     22      1.1    kardel flag = {
     23  1.1.1.3  christos   name		= ipv4;
     24  1.1.1.3  christos   value		= 4;
     25  1.1.1.3  christos   flags-cant	= ipv6;
     26  1.1.1.3  christos   descrip	= "Force IPv4 DNS name resolution";
     27  1.1.1.3  christos   doc		= <<- _EndOfDoc_
     28  1.1.1.2    kardel 	Force DNS resolution of the following host names on the command line
     29      1.1    kardel 	to the IPv4 namespace.
     30      1.1    kardel 	_EndOfDoc_;
     31      1.1    kardel };
     32      1.1    kardel 
     33      1.1    kardel flag = {
     34  1.1.1.3  christos   name		= ipv6;
     35  1.1.1.3  christos   value		= 6;
     36  1.1.1.3  christos   flags-cant	= ipv4;
     37  1.1.1.3  christos   descrip	= "Force IPv6 DNS name resolution";
     38  1.1.1.3  christos   doc		= <<- _EndOfDoc_
     39  1.1.1.2    kardel 	Force DNS resolution of the following host names on the command line
     40      1.1    kardel 	to the IPv6 namespace.
     41      1.1    kardel 	_EndOfDoc_;
     42      1.1    kardel };
     43      1.1    kardel 
     44  1.1.1.3  christos flag = {
     45  1.1.1.3  christos   name		= authentication;
     46  1.1.1.3  christos   value		= a;
     47  1.1.1.3  christos   descrip	= "Enable authentication with the key @var{auth-keynumber}";
     48  1.1.1.3  christos   arg-type	= number;
     49  1.1.1.3  christos   arg-name	= "auth-keynumber";
     50  1.1.1.3  christos   doc		= <<- _EndOfDoc_
     51  1.1.1.3  christos 	Enable authentication using the key specified in this option's
     52  1.1.1.3  christos 	argument.  The argument of this option is the @option{keyid}, a
     53  1.1.1.3  christos 	number specified in the @option{keyfile} as this key's identifier.
     54  1.1.1.3  christos 	See the @option{keyfile} option (@option{-k}) for more details.
     55  1.1.1.3  christos 	_EndOfDoc_;
     56  1.1.1.3  christos };
     57      1.1    kardel 
     58      1.1    kardel flag = {
     59  1.1.1.3  christos   name		= broadcast;
     60  1.1.1.3  christos   value		= b;
     61  1.1.1.3  christos   descrip	= "Listen to the address specified for broadcast time sync";
     62  1.1.1.3  christos   arg-type	= string;
     63  1.1.1.3  christos   arg-name	= "broadcast-address";
     64  1.1.1.3  christos   max		 = NOLIMIT;
     65  1.1.1.3  christos   stack-arg;
     66  1.1.1.3  christos   doc		= <<- _EndOfDoc_
     67  1.1.1.3  christos 	If specified @code{sntp} will listen to the specified address
     68  1.1.1.3  christos 	for NTP broadcasts.  The default maximum wait time
     69  1.1.1.3  christos 	can (and probably should) be modified with @option{-t}.
     70      1.1    kardel 	_EndOfDoc_;
     71      1.1    kardel };
     72      1.1    kardel 
     73      1.1    kardel flag = {
     74  1.1.1.3  christos   name	 	= concurrent;
     75  1.1.1.3  christos   value		= c;
     76  1.1.1.3  christos   descrip	= "Concurrently query all IPs returned for host-name";
     77  1.1.1.3  christos   arg-type	= string;
     78  1.1.1.3  christos   arg-name	= "host-name";
     79  1.1.1.3  christos   max		= NOLIMIT;
     80  1.1.1.3  christos   stack-arg;
     81  1.1.1.3  christos   doc		= <<- _EndOfDoc_
     82  1.1.1.3  christos 	Requests from an NTP "client" to a "server" should never be sent
     83  1.1.1.3  christos 	more rapidly than one every 2 seconds.  By default, any IPs returned
     84  1.1.1.3  christos 	as part of a DNS lookup are assumed to be for a single instance of
     85  1.1.1.3  christos 	@code{ntpd}, and therefore @code{sntp} will send queries to these IPs
     86  1.1.1.3  christos 	one after another, with a 2-second gap in between each query.
     87  1.1.1.3  christos 
     88  1.1.1.3  christos 	The @option{-c} or @option{--concurrent} flag says that any IPs
     89  1.1.1.3  christos 	returned for the DNS lookup of the supplied host-name are on
     90  1.1.1.3  christos 	different machines, so we can send concurrent queries.
     91      1.1    kardel 	_EndOfDoc_;
     92      1.1    kardel };
     93      1.1    kardel 
     94  1.1.1.3  christos #include debug-opt.def
     95      1.1    kardel 
     96      1.1    kardel flag = {
     97  1.1.1.3  christos   name		= gap;
     98  1.1.1.3  christos   value		= g;
     99  1.1.1.3  christos   descrip	= "The gap (in milliseconds) between time requests";
    100  1.1.1.3  christos   arg-type	= number;
    101  1.1.1.3  christos   arg-name	= "milliseconds";
    102  1.1.1.3  christos   arg-default	= 50;
    103  1.1.1.3  christos   doc		= <<- _EndOfDoc_
    104  1.1.1.3  christos 	Since we're only going to use the first valid response we get and
    105  1.1.1.3  christos 	there is benefit to specifying a good number of servers to query,
    106  1.1.1.3  christos 	separate the queries we send out by the specified number of
    107  1.1.1.3  christos 	milliseconds.
    108      1.1    kardel 	_EndOfDoc_;
    109  1.1.1.2    kardel };
    110      1.1    kardel 
    111      1.1    kardel flag = {
    112  1.1.1.3  christos   name		= kod;
    113  1.1.1.3  christos   value		= K;
    114  1.1.1.3  christos   arg-type	= file;
    115  1.1.1.3  christos   arg-name	= "file-name";
    116  1.1.1.3  christos   arg-default	= "/var/db/ntp-kod";
    117  1.1.1.3  christos   descrip	= "KoD history filename";
    118  1.1.1.3  christos   doc		= <<- _EndOfDoc_
    119  1.1.1.3  christos 	Specifies the filename to be used for the persistent history of KoD
    120  1.1.1.4  christos 	responses received from servers.  If the file does not exist, a
    121  1.1.1.4  christos 	warning message will be displayed.  The file will not be created.
    122      1.1    kardel 	_EndOfDoc_;
    123      1.1    kardel };
    124      1.1    kardel 
    125      1.1    kardel flag = {
    126  1.1.1.3  christos   name		= keyfile;
    127  1.1.1.3  christos   value		= k;
    128  1.1.1.3  christos   descrip	= "Look in this file for the key specified with @option{-a}";
    129  1.1.1.3  christos   arg-type	= file;
    130  1.1.1.3  christos   arg-name	= "file-name";
    131  1.1.1.6  christos   arg-default	= "/etc/ntp.keys";
    132  1.1.1.3  christos   doc		= <<- _EndOfDoc_
    133  1.1.1.3  christos 	This option specifies the keyfile.
    134  1.1.1.3  christos 	@code{sntp} will search for the key specified with @option{-a}
    135  1.1.1.3  christos 	@file{keyno} in this file.  See @command{ntp.keys(5)} for more
    136  1.1.1.3  christos 	information.
    137      1.1    kardel 	_EndOfDoc_;
    138      1.1    kardel };
    139      1.1    kardel 
    140      1.1    kardel flag = {
    141  1.1.1.3  christos   name		= logfile;
    142  1.1.1.3  christos   value		= l;
    143  1.1.1.3  christos   arg-type	= file;
    144  1.1.1.3  christos   arg-name	= "file-name";
    145  1.1.1.3  christos   descrip	= "Log to specified logfile";
    146  1.1.1.3  christos   doc		= <<- _EndOfDoc_
    147  1.1.1.3  christos 	This option causes the client to write log messages to the specified
    148  1.1.1.3  christos 	@file{logfile}.
    149      1.1    kardel 	_EndOfDoc_;
    150      1.1    kardel };
    151      1.1    kardel 
    152      1.1    kardel flag = {
    153  1.1.1.3  christos   name		= steplimit;
    154  1.1.1.3  christos   value		= M;
    155  1.1.1.3  christos   arg-type	= number;
    156  1.1.1.3  christos   arg-range	= "0->";
    157  1.1.1.3  christos   descrip	= "Adjustments less than @var{steplimit} msec will be slewed";
    158  1.1.1.3  christos   doc		= <<- _EndOfDoc_
    159  1.1.1.3  christos 	If the time adjustment is less than @file{steplimit} milliseconds,
    160  1.1.1.3  christos 	slew the amount using @command{adjtime(2)}.  Otherwise, step the
    161  1.1.1.5  christos 	correction using @command{settimeofday(2)}.  The default value is 0,
    162  1.1.1.5  christos 	which means all adjustments will be stepped.  This is a feature, as
    163  1.1.1.5  christos 	different situations demand different values.
    164      1.1    kardel 	_EndOfDoc_;
    165      1.1    kardel };
    166      1.1    kardel 
    167      1.1    kardel flag = {
    168  1.1.1.3  christos   name		= ntpversion;
    169  1.1.1.3  christos   value		= o;
    170  1.1.1.3  christos   descrip	= "Send @var{int} as our NTP protocol version";
    171  1.1.1.3  christos   arg-type	= number;
    172  1.1.1.3  christos   arg-default	= 4;
    173  1.1.1.3  christos   arg-range	= "0->7";
    174  1.1.1.3  christos   doc		= <<- _EndOfDoc_
    175  1.1.1.3  christos 	When sending requests to a remote server, tell them we are running
    176  1.1.1.3  christos 	NTP protocol version @file{ntpversion} .
    177      1.1    kardel 	_EndOfDoc_;
    178      1.1    kardel };
    179      1.1    kardel 
    180      1.1    kardel flag = {
    181  1.1.1.3  christos   name		= usereservedport;
    182  1.1.1.3  christos   value		= r;
    183  1.1.1.3  christos   descrip	= "Use the NTP Reserved Port (port 123)";
    184  1.1.1.3  christos   doc		= <<- _EndOfDoc_
    185  1.1.1.3  christos 	Use port 123, which is reserved for NTP, for our network
    186  1.1.1.3  christos 	communications.
    187      1.1    kardel 	_EndOfDoc_;
    188      1.1    kardel };
    189      1.1    kardel 
    190      1.1    kardel flag = {
    191  1.1.1.3  christos   name		= step;
    192  1.1.1.3  christos   value		= S;
    193  1.1.1.3  christos   descrip	= "OK to 'step' the time with @command{settimeofday(2)}";
    194  1.1.1.3  christos   doc		= <<- _EndOfDoc_
    195  1.1.1.3  christos 	_EndOfDoc_;
    196  1.1.1.3  christos };
    197      1.1    kardel 
    198  1.1.1.3  christos flag = {
    199  1.1.1.3  christos   name		= slew;
    200  1.1.1.3  christos   value		= s;
    201  1.1.1.3  christos   descrip	= "OK to 'slew' the time with @command{adjtime(2)}";
    202  1.1.1.3  christos   doc		= <<- _EndOfDoc_
    203  1.1.1.3  christos 	_EndOfDoc_;
    204  1.1.1.3  christos };
    205      1.1    kardel 
    206      1.1    kardel 
    207  1.1.1.3  christos flag = {
    208  1.1.1.3  christos   name		= timeout;
    209  1.1.1.3  christos   value		= t;
    210  1.1.1.3  christos   descrip	= "The number of seconds to wait for responses";
    211  1.1.1.3  christos   arg-type	= number;
    212  1.1.1.3  christos   arg-name	= "seconds";
    213  1.1.1.3  christos   arg-default	= 5;
    214  1.1.1.3  christos   doc		= <<- _EndOfDoc_
    215  1.1.1.3  christos 	When waiting for a reply, @code{sntp} will wait the number
    216  1.1.1.3  christos 	of seconds specified before giving up.  The default should be
    217  1.1.1.3  christos 	more than enough for a unicast response.  If @code{sntp} is
    218  1.1.1.3  christos 	only waiting for a broadcast response a longer timeout is
    219  1.1.1.3  christos 	likely needed.
    220      1.1    kardel 	_EndOfDoc_;
    221      1.1    kardel };
    222      1.1    kardel 
    223  1.1.1.3  christos flag = {
    224  1.1.1.3  christos   name		= "wait";
    225  1.1.1.3  christos   descrip	= "Wait for pending replies (if not setting the time)";
    226  1.1.1.3  christos   disable	= no;
    227  1.1.1.3  christos   enabled;
    228  1.1.1.3  christos   settable;
    229  1.1.1.3  christos   doc		= <<- _EndOfDoc_
    230  1.1.1.3  christos 	If we are not setting the time, wait for all pending responses.
    231  1.1.1.3  christos 	_EndOfDoc_;
    232  1.1.1.3  christos };
    233      1.1    kardel 
    234  1.1.1.2    kardel /* explain: Additional information whenever the usage routine is invoked */
    235  1.1.1.2    kardel explain = <<- _END_EXPLAIN
    236  1.1.1.2    kardel 	_END_EXPLAIN;
    237      1.1    kardel 
    238  1.1.1.3  christos doc-section	= {
    239  1.1.1.3  christos   ds-type	= 'DESCRIPTION';
    240  1.1.1.3  christos   ds-format	= 'mdoc';
    241  1.1.1.3  christos   ds-text	= <<- _END_PROG_MDOC_DESCRIP
    242  1.1.1.3  christos .Nm
    243  1.1.1.3  christos can be used as an SNTP client to query a NTP or SNTP server and either display
    244      1.1    kardel the time or set the local system's time (given suitable privilege).  It can be
    245  1.1.1.3  christos run as an interactive command or from a
    246  1.1.1.3  christos .Ic cron
    247      1.1    kardel job.
    248      1.1    kardel 
    249      1.1    kardel NTP (the Network Time Protocol) and SNTP (the Simple Network Time Protocol)
    250  1.1.1.2    kardel are defined and described by RFC 5905.
    251      1.1    kardel 
    252  1.1.1.3  christos .Pp
    253      1.1    kardel The default is to write the estimated correct local date and time (i.e. not
    254  1.1.1.3  christos UTC) to the standard output in a format like:
    255  1.1.1.2    kardel 
    256  1.1.1.3  christos .Ic "'1996-10-15 20:17:25.123 (+0800) +4.567 +/- 0.089 [host] IP sN'"
    257  1.1.1.2    kardel 
    258  1.1.1.2    kardel where the
    259  1.1.1.3  christos .Ic "'(+0800)'"
    260  1.1.1.3  christos means that to get to UTC from the reported local time one must
    261  1.1.1.3  christos add 8 hours and 0 minutes,
    262  1.1.1.3  christos the
    263  1.1.1.3  christos .Ic "'+4.567'"
    264  1.1.1.2    kardel indicates the local clock is 4.567 seconds behind the correct time
    265  1.1.1.3  christos (so 4.567 seconds must be added to the local clock to get it to be correct).
    266  1.1.1.3  christos Note that the number of decimals printed for this value will change
    267  1.1.1.3  christos based on the reported precision of the server.
    268  1.1.1.3  christos .Ic "'+/- 0.089'"
    269  1.1.1.3  christos is the reported
    270  1.1.1.3  christos .Em synchronization distance
    271  1.1.1.3  christos (in seconds), which represents the maximum error due to all causes.
    272  1.1.1.3  christos If the server does not report valid data needed to calculate the
    273  1.1.1.3  christos synchronization distance, this will be reported as
    274  1.1.1.3  christos .Ic "'+/- ?'" .
    275  1.1.1.3  christos If the
    276  1.1.1.3  christos .Em host
    277  1.1.1.3  christos is different from the
    278  1.1.1.3  christos .Em IP ,
    279  1.1.1.3  christos both will be displayed.
    280  1.1.1.3  christos Otherwise, only the
    281  1.1.1.3  christos .Em IP
    282  1.1.1.3  christos is displayed.
    283  1.1.1.3  christos Finally, the
    284  1.1.1.3  christos .Em stratum
    285  1.1.1.5  christos of the host is reported
    286  1.1.1.5  christos and the leap indicator is decoded and displayed.
    287  1.1.1.3  christos 	_END_PROG_MDOC_DESCRIP;
    288  1.1.1.3  christos };
    289  1.1.1.3  christos 
    290  1.1.1.3  christos doc-section	= {
    291  1.1.1.3  christos   ds-type	= 'USAGE';
    292  1.1.1.3  christos   ds-format	= 'mdoc';
    293  1.1.1.3  christos   ds-text	= <<- _END_MDOC_USAGE
    294  1.1.1.3  christos .Bl -tag -width indent
    295  1.1.1.3  christos .It Li "sntp ntpserver.somewhere"
    296  1.1.1.3  christos is the simplest use of this program
    297  1.1.1.3  christos and can be run as an unprivileged command
    298  1.1.1.3  christos to check the current time and error in the local clock.
    299  1.1.1.5  christos .It Li "sntp -Ss -M 128 ntpserver.somewhere"
    300  1.1.1.3  christos With suitable privilege,
    301  1.1.1.3  christos run as a command
    302  1.1.1.3  christos or from a
    303  1.1.1.3  christos .Xr cron 8
    304  1.1.1.3  christos job,
    305  1.1.1.5  christos .Ic "sntp -Ss -M 128 ntpserver.somewhere"
    306  1.1.1.5  christos will request the time from the server,
    307  1.1.1.5  christos and if that server reports that it is synchronized
    308  1.1.1.5  christos then if the offset adjustment is less than 128 milliseconds
    309  1.1.1.5  christos the correction will be slewed,
    310  1.1.1.5  christos and if the correction is more than 128 milliseconds
    311  1.1.1.5  christos the correction  will be stepped.
    312  1.1.1.5  christos .It Li "sntp -S ntpserver.somewhere"
    313  1.1.1.5  christos With suitable privilege,
    314  1.1.1.5  christos run as a command
    315  1.1.1.5  christos or from a
    316  1.1.1.5  christos .Xr cron 8
    317  1.1.1.5  christos job,
    318  1.1.1.5  christos .Ic "sntp -S ntpserver.somewhere"
    319  1.1.1.5  christos will set (step) the local clock from a synchronized specified server,
    320  1.1.1.3  christos like the (deprecated)
    321  1.1.1.3  christos .Xr ntpdate 1ntpdatemdoc ,
    322  1.1.1.3  christos or
    323  1.1.1.3  christos .Xr rdate 8
    324  1.1.1.3  christos commands.
    325  1.1.1.3  christos .El
    326  1.1.1.3  christos 	_END_MDOC_USAGE;
    327  1.1.1.3  christos };
    328  1.1.1.3  christos 
    329  1.1.1.3  christos doc-section	= {
    330  1.1.1.3  christos   ds-type	= 'AUTHORS';
    331  1.1.1.3  christos   ds-format	= 'mdoc';
    332  1.1.1.3  christos   ds-text	= <<- _END_MDOC_AUTHORS
    333  1.1.1.3  christos .An "Johannes Maximilian Kuehn"
    334  1.1.1.3  christos .An "Harlan Stenn"
    335  1.1.1.3  christos .An "Dave Hart"
    336  1.1.1.3  christos 	_END_MDOC_AUTHORS;
    337  1.1.1.3  christos };
    338