Commit 90a1dc37 authored by Gavin Brown's avatar Gavin Brown
Browse files

set default UpdateInterval to 300

parent eb7fd303
# NAME
.\" Automatically generated by Pod::Man 2.27 (Pod::Simple 3.28)
.\"
.\" Standard preamble:
.\" ========================================================================
.de Sp \" Vertical space (when we can't use .PP)
.if t .sp .5v
.if n .sp
..
.de Vb \" Begin verbatim text
.ft CW
.nf
.ne \\$1
..
.de Ve \" End verbatim text
.ft R
.fi
..
.\" Set up some character translations and predefined strings. \*(-- will
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
.\" double quote, and \*(R" will give a right double quote. \*(C+ will
.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
.\" nothing in troff, for use with C<>.
.tr \(*W-
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
.ie n \{\
. ds -- \(*W-
. ds PI pi
. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
. ds L" ""
. ds R" ""
. ds C` ""
. ds C' ""
'br\}
.el\{\
. ds -- \|\(em\|
. ds PI \(*p
. ds L" ``
. ds R" ''
. ds C`
. ds C'
'br\}
.\"
.\" Escape single quotes in literal strings from groff's Unicode transform.
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.\"
.\" If the F register is turned on, we'll generate index entries on stderr for
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
.\" entries marked with X<> in POD. Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
.\"
.\" Avoid warning from groff about undefined register 'F'.
.de IX
..
.nr rF 0
.if \n(.g .if rF .nr rF 1
.if (\n(rF:(\n(.g==0)) \{
. if \nF \{
. de IX
. tm Index:\\$1\t\\n%\t"\\$2"
..
. if !\nF==2 \{
. nr % 0
. nr F 2
. \}
. \}
.\}
.rr rF
.\"
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
.\" Fear. Run. Save yourself. No user-serviceable parts.
. \" fudge factors for nroff and troff
.if n \{\
. ds #H 0
. ds #V .8m
. ds #F .3m
. ds #[ \f1
. ds #] \fP
.\}
.if t \{\
. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
. ds #V .6m
. ds #F 0
. ds #[ \&
. ds #] \&
.\}
. \" simple accents for nroff and troff
.if n \{\
. ds ' \&
. ds ` \&
. ds ^ \&
. ds , \&
. ds ~ ~
. ds /
.\}
.if t \{\
. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
.\}
. \" troff and (daisy-wheel) nroff accents
.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
.ds ae a\h'-(\w'a'u*4/10)'e
.ds Ae A\h'-(\w'A'u*4/10)'E
. \" corrections for vroff
.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
. \" for low resolution devices (crt and lpr)
.if \n(.H>23 .if \n(.V>19 \
\{\
. ds : e
. ds 8 ss
. ds o a
. ds d- d\h'-1'\(ga
. ds D- D\h'-1'\(hy
. ds th \o'bp'
. ds Th \o'LP'
. ds ae ae
. ds Ae AE
.\}
.rm #[ #] #H #V #F C
.\" ========================================================================
.\"
.IX Title "IO::FILE=IO(0X10787E8) 1"
.TH IO::FILE=IO(0X10787E8) 1 "2019-08-04" "perl v5.16.3" "User Contributed Perl Documentation"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.nh
.SH "NAME"
rdnsd is a remote DNS server monitoring system.
# DESCRIPTION
`rdnsd` can be used to monitor the availability and responsiveness of
remote DNS servers. Given a list of DNS servers, it will periodically
.SH "DESCRIPTION"
.IX Header "DESCRIPTION"
\&\f(CW\*(C`rdnsd\*(C'\fR can be used to monitor the availability and responsiveness of
remote \s-1DNS\s0 servers. Given a list of \s-1DNS\s0 servers, it will periodically
query each server and record whether a response was received, and how
quickly. This information can then be obtained by querying a database.
# USAGE
rdnsd [--help|--config=/etc/rdnsd/rdns.conf [--debug]]
# OPTIONS
.SH "USAGE"
.IX Header "USAGE"
.Vb 1
\& rdnsd [\-\-help|\-\-config=/etc/rdnsd/rdns.conf [\-\-debug]]
.Ve
.SH "OPTIONS"
.IX Header "OPTIONS"
The following command line options are supported:
- `--help`
Display help text.
- `--config=FILE`
Specify the configuration file. See ["CONFIGURATION FILE"](#configuration-file) for further
details. If not specified, `/etc/rdnsd/rdnsd.conf` is used.
- `--debug`
Enable debug mode. `rdnsd` will not daemonise and will emit debugging
information to STDERR.
# CONFIGURATION FILE
`rdnsd` must be configured using a configuration file. The following
.IP "\(bu" 4
\&\f(CW\*(C`\-\-help\*(C'\fR
.Sp
Display help text.
.IP "\(bu" 4
\&\f(CW\*(C`\-\-config=FILE\*(C'\fR
.Sp
Specify the configuration file. See \*(L"\s-1CONFIGURATION FILE\*(R"\s0 for further
details. If not specified, \f(CW\*(C`/etc/rdnsd/rdnsd.conf\*(C'\fR is used.
.IP "\(bu" 4
\&\f(CW\*(C`\-\-debug\*(C'\fR
.Sp
Enable debug mode. \f(CW\*(C`rdnsd\*(C'\fR will not daemonise and will emit debugging
information to \s-1STDERR.\s0
.SH "CONFIGURATION FILE"
.IX Header "CONFIGURATION FILE"
\&\f(CW\*(C`rdnsd\*(C'\fR must be configured using a configuration file. The following
is an example:
NodeID my-node-id
UpdateInterval 293
PidFile /var/run/rdnsd/rdnsd.pid
Database /var/run/rdnsd/rdnsd.db
Percentile 95
AddressFamily 4
Protocol udp
Loop 3
Timeout 1
Recurse false
Question . A IN
Servers ns1.example.com,ns2.example.net
Domains example.com
.PP
.Vb 10
\& NodeID my\-node\-id
\& UpdateInterval 300
\& PidFile /var/run/rdnsd/rdnsd.pid
\& Database /var/run/rdnsd/rdnsd.db
\& Percentile 95
\& AddressFamily 4
\& Protocol udp
\& Loop 3
\& Timeout 1
\& Recurse false
\& Question . A IN
\& Servers ns1.example.com,ns2.example.net
\& Domains example.com
.Ve
.PP
The directives are explained below.
## `NodeID ID`
Default: `$HOSTNAME`
This value is insterted into the \`node\_id\` column of stats database. It
.ie n .SS """NodeID ID"""
.el .SS "\f(CWNodeID ID\fP"
.IX Subsection "NodeID ID"
Default: \f(CW$HOSTNAME\fR
.PP
This value is insterted into the `node_id` column of stats database. It
disambiguates the source of each row, allowing data from multiple
monitoring nodes to be aggregated losslessly.
.PP
If not set, the system's host name is used.
## `UpdateInterval TIME`
Default: `293`
This parameter tells `rdnsd` to automatically update the statistics
database every `TIME` seconds. This value **MUST** be more than
`Loop x Timeout` seconds, and **SHOULD** be at least three times that
.ie n .SS """UpdateInterval TIME"""
.el .SS "\f(CWUpdateInterval TIME\fP"
.IX Subsection "UpdateInterval TIME"
Default: \f(CW300\fR
.PP
This parameter tells \f(CW\*(C`rdnsd\*(C'\fR to automatically update the statistics
database every \f(CW\*(C`TIME\*(C'\fR seconds. This value \fB\s-1MUST\s0\fR be more than
\&\f(CW\*(C`Loop x Timeout\*(C'\fR seconds, and \fB\s-1SHOULD\s0\fR be at least three times that
value.
## `PidFile /path/to/pid/file`
Default: `/var/run/rdnsd/rdnsd.pid`
The file where `rdnsd` will write its pid.
## `Database FILE`
.ie n .SS """PidFile /path/to/pid/file"""
.el .SS "\f(CWPidFile /path/to/pid/file\fP"
.IX Subsection "PidFile /path/to/pid/file"
Default: \f(CW\*(C`/var/run/rdnsd/rdnsd.pid\*(C'\fR
.PP
The file where \f(CW\*(C`rdnsd\*(C'\fR will write its pid.
.ie n .SS """Database FILE"""
.el .SS "\f(CWDatabase FILE\fP"
.IX Subsection "Database FILE"
Default: none
The `Database` directive can take two forms:
- the path to an SQLite database on disk
- a [DBI](https://metacpan.org/pod/DBI) DSN
If the value of the `Database` directive looks like a DSN (i.e.
it begins with `dbi:`) then `rdnsd` will use the authentication
credentials specified in by the `DBUsername` and `DBPassword`
.PP
The \f(CW\*(C`Database\*(C'\fR directive can take two forms:
.IP "\(bu" 4
the path to an SQLite database on disk
.IP "\(bu" 4
a \s-1DBI\s0 \s-1DSN\s0
.PP
If the value of the \f(CW\*(C`Database\*(C'\fR directive looks like a \s-1DSN \s0(i.e.
it begins with \f(CW\*(C`dbi:\*(C'\fR) then \f(CW\*(C`rdnsd\*(C'\fR will use the authentication
credentials specified in by the \f(CW\*(C`DBUsername\*(C'\fR and \f(CW\*(C`DBPassword\*(C'\fR
directives.
On startup, `rdnsd` will attempt to connect to the specified
database and will create the `rdnsd` table. Because each RDBMS
.PP
On startup, \f(CW\*(C`rdnsd\*(C'\fR will attempt to connect to the specified
database and will create the \f(CW\*(C`rdnsd\*(C'\fR table. Because each \s-1RDBMS\s0
has its own syntax for creating tables, only SQLite and MySQL
databases are currently supported (support for other databases
is easy to add, so submit a patch!)
.PP
The database will contain a single, which will contain the
following columns. The name of the table is determined by the
`DTable` directive.
- `id` - unique row ID
- `node_id` - node ID/hostname
- `start_time` - date+time the monitoring interval began
- `ends_time` - date+time the monitoring interval ended
- `host` - server name
- `family` - IP version (4 or 6)
- `proto` - transport protocol (UDP or TCP)
- `count` - number of queries sent to the server
- `success` - number of successful queries
- `rate` - response rate as a decimal between 0 and 1 (equivalent
to `success / rate`)
- `min_time` - lowest observed RTT in milliseconds
- `time` - average RTT in milliseconds
- `time` - highest observed RTT in milliseconds
- `percentile_time` - average RTT in milliseconds at the
\&\f(CW\*(C`DTable\*(C'\fR directive.
.IP "\(bu" 4
\&\f(CW\*(C`id\*(C'\fR \- unique row \s-1ID\s0
.IP "\(bu" 4
\&\f(CW\*(C`node_id\*(C'\fR \- node ID/hostname
.IP "\(bu" 4
\&\f(CW\*(C`start_time\*(C'\fR \- date+time the monitoring interval began
.IP "\(bu" 4
\&\f(CW\*(C`ends_time\*(C'\fR \- date+time the monitoring interval ended
.IP "\(bu" 4
\&\f(CW\*(C`host\*(C'\fR \- server name
.IP "\(bu" 4
\&\f(CW\*(C`family\*(C'\fR \- \s-1IP\s0 version (4 or 6)
.IP "\(bu" 4
\&\f(CW\*(C`proto\*(C'\fR \- transport protocol (\s-1UDP\s0 or \s-1TCP\s0)
.IP "\(bu" 4
\&\f(CW\*(C`count\*(C'\fR \- number of queries sent to the server
.IP "\(bu" 4
\&\f(CW\*(C`success\*(C'\fR \- number of successful queries
.IP "\(bu" 4
\&\f(CW\*(C`rate\*(C'\fR \- response rate as a decimal between 0 and 1 (equivalent
to \f(CW\*(C`success / rate\*(C'\fR)
.IP "\(bu" 4
\&\f(CW\*(C`min_time\*(C'\fR \- lowest observed \s-1RTT\s0 in milliseconds
.IP "\(bu" 4
\&\f(CW\*(C`time\*(C'\fR \- average \s-1RTT\s0 in milliseconds
.IP "\(bu" 4
\&\f(CW\*(C`time\*(C'\fR \- highest observed \s-1RTT\s0 in milliseconds
.IP "\(bu" 4
\&\f(CW\*(C`percentile_time\*(C'\fR \- average \s-1RTT\s0 in milliseconds at the
configured percentile.
## `DBUsername USERNAME`
.ie n .SS """DBUsername USERNAME"""
.el .SS "\f(CWDBUsername USERNAME\fP"
.IX Subsection "DBUsername USERNAME"
Default: none
.PP
Specifies the username for database authentication.
## `DBPassword PASSWORD`
.ie n .SS """DBPassword PASSWORD"""
.el .SS "\f(CWDBPassword PASSWORD\fP"
.IX Subsection "DBPassword PASSWORD"
Default: none
.PP
Specifies the password for database authentication.
## `DBTable TABLE`
Default: `rdnsd`
Specifies the name of the table that `rdnsd` will use.
## `Percentile PERCENTILE`
.ie n .SS """DBTable TABLE"""
.el .SS "\f(CWDBTable TABLE\fP"
.IX Subsection "DBTable TABLE"
Default: \f(CW\*(C`rdnsd\*(C'\fR
.PP
Specifies the name of the table that \f(CW\*(C`rdnsd\*(C'\fR will use.
.ie n .SS """Percentile PERCENTILE"""
.el .SS "\f(CWPercentile PERCENTILE\fP"
.IX Subsection "Percentile PERCENTILE"
Default: none
If this option is set, `rdnsd` will calculate the response time at the
.PP
If this option is set, \f(CW\*(C`rdnsd\*(C'\fR will calculate the response time at the
given percentile.
## `AddressFamily (4|6)`
Default: `4`
.ie n .SS """AddressFamily (4|6)"""
.el .SS "\f(CWAddressFamily (4|6)\fP"
.IX Subsection "AddressFamily (4|6)"
Default: \f(CW4\fR
.PP
Specifies whether to prefer IPv4 or IPv6 when talking to nameservers, if
the servers are identified by name rather than address (or when loaded
from SRV records). If not defined, the default behaviour is to prefer
from \s-1SRV\s0 records). If not defined, the default behaviour is to prefer
IPv4.
## `Protocol (udp|tcp)`
Default: `udp`
Specify the transport protocol (UDP or TCP) to use.
## `Loop SECONDS`
Default: `3`
.ie n .SS """Protocol (udp|tcp)"""
.el .SS "\f(CWProtocol (udp|tcp)\fP"
.IX Subsection "Protocol (udp|tcp)"
Default: \f(CW\*(C`udp\*(C'\fR
.PP
Specify the transport protocol (\s-1UDP\s0 or \s-1TCP\s0) to use.
.ie n .SS """Loop SECONDS"""
.el .SS "\f(CWLoop SECONDS\fP"
.IX Subsection "Loop SECONDS"
Default: \f(CW3\fR
.PP
This specifies the length of the main loop. If this is set to 2, then
each server will be checked every 2 seconds. This value can be a decimal
fraction, eg 0.25.
## `Timeout SECONDS`
Default: `1`
This specifies the timeout for DNS queries. A server will be considered
.ie n .SS """Timeout SECONDS"""
.el .SS "\f(CWTimeout SECONDS\fP"
.IX Subsection "Timeout SECONDS"
Default: \f(CW1\fR
.PP
This specifies the timeout for \s-1DNS\s0 queries. A server will be considered
down if it does not respond within this amount of time. This value
**MUST** be less than the value of `Loop`.
## `Recurse (true|false)`
Default: `false`
Enable recursion (i.e. set the \`rd\` bit on the queries sent to servers).
## `Question QUESTION`
Default: `example.com. IN A`
Specify the DNS question. The format is "QNAME QCLASS QTYPE".
## `Servers SERVERS`
\&\fB\s-1MUST\s0\fR be less than the value of \f(CW\*(C`Loop\*(C'\fR.
.ie n .SS """Recurse (true|false)"""
.el .SS "\f(CWRecurse (true|false)\fP"
.IX Subsection "Recurse (true|false)"
Default: \f(CW\*(C`false\*(C'\fR
.PP
Enable recursion (i.e. set the `rd` bit on the queries sent to servers).
.ie n .SS """Question QUESTION"""
.el .SS "\f(CWQuestion QUESTION\fP"
.IX Subsection "Question QUESTION"
Default: \f(CW\*(C`example.com. IN A\*(C'\fR
.PP
Specify the \s-1DNS\s0 question. The format is \*(L"\s-1QNAME QCLASS QTYPE\*(R".\s0
.ie n .SS """Servers SERVERS"""
.el .SS "\f(CWServers SERVERS\fP"
.IX Subsection "Servers SERVERS"
Default: none
.PP
Specify the servers to be checked. You can either specify a server name
(which will be resolved to a set of IP addresses), or literal IPv4 or
(which will be resolved to a set of \s-1IP\s0 addresses), or literal IPv4 or
IPv6 addresses.
This directive can't be used at the same time as the `Domains`
.PP
This directive can't be used at the same time as the \f(CW\*(C`Domains\*(C'\fR
directive.
## `Domains DOMAINS`
.ie n .SS """Domains DOMAINS"""
.el .SS "\f(CWDomains DOMAINS\fP"
.IX Subsection "Domains DOMAINS"
Default: none
.PP
Rather than specifying a list of nameservers, you can provide a list of
domains instead. For each domain, `rdnsd` will query for `SRV` records
for `_dns._udp` under the domain and use the targets of any `SRV`
domains instead. For each domain, \f(CW\*(C`rdnsd\*(C'\fR will query for \f(CW\*(C`SRV\*(C'\fR records
for \f(CW\*(C`_dns._udp\*(C'\fR under the domain and use the targets of any \f(CW\*(C`SRV\*(C'\fR
records returned.
The server list will be updated when the TTL on the `SRV` records
.PP
The server list will be updated when the \s-1TTL\s0 on the \f(CW\*(C`SRV\*(C'\fR records
expires.
This directive can't be used at the same time as the `Servers`
.PP
This directive can't be used at the same time as the \f(CW\*(C`Servers\*(C'\fR
directive.
## `StatsFile /path/to/stats/file`
.ie n .SS """StatsFile /path/to/stats/file"""
.el .SS "\f(CWStatsFile /path/to/stats/file\fP"
.IX Subsection "StatsFile /path/to/stats/file"
Default: none
**Note:** this is a legacy option to provide backwards compatibility with
older versions of `rdnsd`. It specifies a file to which `rdnsd` will
.PP
\&\fBNote:\fR this is a legacy option to provide backwards compatibility with
older versions of \f(CW\*(C`rdnsd\*(C'\fR. It specifies a file to which \f(CW\*(C`rdnsd\*(C'\fR will
write statistics.
See ["LEGACY STATISTICS FILE FORMAT"](#legacy-statistics-file-format) for further information.
# RELOADING THE CONFIGURATION FILE
`rdnsd` will reload its configuration if you send it a `SIGHUP`:
$ kill -HUP `cat /path/to/pid/file`
# OBTAINING STATISTICS
Every `UpdateInterval` seconds, `rdnsd` will write stats to the
database specified by `Database`, and, if set, the file specified by
`StatsFile`.
Once the database has been updated, `rdnsd`'s internal data is reset,
.PP
See \*(L"\s-1LEGACY STATISTICS FILE FORMAT\*(R"\s0 for further information.
.SH "RELOADING THE CONFIGURATION FILE"
.IX Header "RELOADING THE CONFIGURATION FILE"
\&\f(CW\*(C`rdnsd\*(C'\fR will reload its configuration if you send it a \f(CW\*(C`SIGHUP\*(C'\fR:
.PP
.Vb 1
\& $ kill \-HUP \`cat /path/to/pid/file\`
.Ve
.SH "OBTAINING STATISTICS"
.IX Header "OBTAINING STATISTICS"
Every \f(CW\*(C`UpdateInterval\*(C'\fR seconds, \f(CW\*(C`rdnsd\*(C'\fR will write stats to the
database specified by \f(CW\*(C`Database\*(C'\fR, and, if set, the file specified by
\&\f(CW\*(C`StatsFile\*(C'\fR.
.PP
Once the database has been updated, \f(CW\*(C`rdnsd\*(C'\fR's internal data is reset,
so subsequent signals will produce fresh statistical data.
## LEGACY STATISTICS FILE FORMAT
Older versions of `rdnsd` used a flat file format for statistics, which
would be updated every `UpdateInterval` seconds, or when `rdnsd`
received the `USR1` signal. This behaviour is now deprecated in favour
.SS "\s-1LEGACY STATISTICS FILE FORMAT\s0"
.IX Subsection "LEGACY STATISTICS FILE FORMAT"
Older versions of \f(CW\*(C`rdnsd\*(C'\fR used a flat file format for statistics, which
would be updated every \f(CW\*(C`UpdateInterval\*(C'\fR seconds, or when \f(CW\*(C`rdnsd\*(C'\fR
received the \f(CW\*(C`USR1\*(C'\fR signal. This behaviour is now deprecated in favour
of a database, but is still supported for backwards compatibility.
.PP
The statistics file will contain one line for each server. Each line
contains the nameserver checked, the response rate as a decimal
fraction, and the average response time (in milliseconds), for example:
ns0.example.com 1.00 25
If the `Percentile` option is set in the config file (or the
`--percentile` argument was given), an additional value will appear at
.PP
.Vb 1
\& ns0.example.com 1.00 25
.Ve
.PP
If the \f(CW\*(C`Percentile\*(C'\fR option is set in the config file (or the
\&\f(CW\*(C`\-\-percentile\*(C'\fR argument was given), an additional value will appear at
the end of the line:
ns0.example.com 1.00 25 36
.PP
.Vb 1
\& ns0.example.com 1.00 25 36
.Ve
.PP
This value is the response time (in milliseconds) at the given
percentile.
# SEE ALSO
- [https://www.centralnic.com/](https://www.centralnic.com/)
- [http://www.net-dns.org/](http://www.net-dns.org/)
# COPYRIGHT
`rdnsd` is Copyright 2019 CentralNic Ltd. All rights reserved. This
.SH "SEE ALSO"
.IX Header "SEE ALSO"
.IP "\(bu" 4
<https://www.centralnic.com/>
.IP "\(bu" 4
<http://www.net\-dns.org/>
.SH "COPYRIGHT"
.IX Header "COPYRIGHT"
\&\f(CW\*(C`rdnsd\*(C'\fR is Copyright 2019 CentralNic Ltd. All rights reserved. This