2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-30 05:57:52 +00:00

Teach dnssec-settime to read times that it writes

The dnssec-settime -p and -up options print times in asctime() and
UNIX time_t formats, respectively. The asctime() format can also be
found inside K*.key public key files. Key files also contain times in
the YYYYMMDDHHMMSS format that can be used in timing parameter
options.

The dnssec-settime -p and -up time formats are now acceptable in
timing parameter options to dnssec-settime and dnssec-keygen, so it is
no longer necessary to parse key files to retrieve times that are
acceptable in timing parameter options.
This commit is contained in:
Tony Finch 2019-04-29 13:56:05 +01:00 committed by Ondřej Surý
parent 745d9db746
commit c38a323082
6 changed files with 92 additions and 32 deletions

View File

@ -221,14 +221,21 @@ Options
Timing Options
~~~~~~~~~~~~~~
Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS. If the
argument begins with a ``+`` or ``-``, it is interpreted as an offset from
the present time. For convenience, if such an offset is followed by one
of the suffixes ``y``, ``mo``, ``w``, ``d``, ``h``, or ``mi``, then the offset is
computed in years (defined as 365 24-hour days, ignoring leap years),
months (defined as 30 24-hour days), weeks, days, hours, or minutes,
respectively. Without a suffix, the offset is computed in seconds. To
explicitly prevent a date from being set, use ``none`` or ``never``.
Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS
(which is the format used inside key files),
or 'Day Mon DD HH:MM:SS YYYY' (as printed by ``dnssec-settime -p``),
or UNIX epoch time (as printed by ``dnssec-settime -up``),
or the literal ``now``.
The argument can be followed by '+' or '-' and an offset from the
given time. The literal ``now`` can be omitted before an offset. The
offset can be followed by one of the suffixes 'y', 'mo', 'w', 'd',
'h', or 'mi', so that it is computed in years (defined as 365 24-hour
days, ignoring leap years), months (defined as 30 24-hour days),
weeks, days, hours, or minutes, respectively. Without a suffix, the
offset is computed in seconds.
To unset a date, use ``none`` or ``never``.
.. option:: -P date/offset

View File

@ -108,14 +108,21 @@ Options
Timing Options
~~~~~~~~~~~~~~
Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS. If the
argument begins with a ``+`` or ``-``, it is interpreted as an offset from
the present time. For convenience, if such an offset is followed by one
of the suffixes ``y``, ``mo``, ``w``, ``d``, ``h``, or ``mi``, then the offset is
computed in years (defined as 365 24-hour days, ignoring leap years),
months (defined as 30 24-hour days), weeks, days, hours, or minutes,
respectively. Without a suffix, the offset is computed in seconds. To
explicitly prevent a date from being set, use ``none`` or ``never``.
Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS
(which is the format used inside key files),
or 'Day Mon DD HH:MM:SS YYYY' (as printed by ``dnssec-settime -p``),
or UNIX epoch time (as printed by ``dnssec-settime -up``),
or the literal ``now``.
The argument can be followed by '+' or '-' and an offset from the
given time. The literal ``now`` can be omitted before an offset. The
offset can be followed by one of the suffixes 'y', 'mo', 'w', 'd',
'h', or 'mi', so that it is computed in years (defined as 365 24-hour
days, ignoring leap years), months (defined as 30 24-hour days),
weeks, days, hours, or minutes, respectively. Without a suffix, the
offset is computed in seconds.
To unset a date, use ``none`` or ``never``.
.. option:: -P date/offset

View File

@ -33,6 +33,7 @@
#include <isc/result.h>
#include <isc/string.h>
#include <isc/time.h>
#include <isc/tm.h>
#include <isc/util.h>
#include <dns/db.h>
@ -285,6 +286,7 @@ strtotime(const char *str, int64_t now, int64_t base, bool *setp) {
const char *orig = str;
char *endp;
size_t n;
struct tm tm;
if (isnone(str)) {
if (setp != NULL) {
@ -306,6 +308,8 @@ strtotime(const char *str, int64_t now, int64_t base, bool *setp) {
* now([+-]offset)
* YYYYMMDD([+-]offset)
* YYYYMMDDhhmmss([+-]offset)
* Day Mon DD HH:MM:SS YYYY([+-]offset)
* 1234567890([+-]offset)
* [+-]offset
*/
n = strspn(str, "0123456789");
@ -325,9 +329,21 @@ strtotime(const char *str, int64_t now, int64_t base, bool *setp) {
}
base = val;
str += n;
} else if (n == 10u &&
(str[n] == '\0' || str[n] == '-' || str[n] == '+')) {
base = strtoll(str, &endp, 0);
str += 10;
} else if (strncmp(str, "now", 3) == 0) {
base = now;
str += 3;
} else if (str[0] >= 'A' && str[0] <= 'Z') {
/* parse ctime() format as written by `dnssec-settime -p` */
endp = isc_tm_strptime(str, "%a %b %d %H:%M:%S %Y", &tm);
if (endp != str + 24) {
fatal("time value %s is invalid", orig);
}
base = mktime(&tm);
str += 24;
}
if (str[0] == '\0') {

View File

@ -208,5 +208,21 @@ n=`expr $n + 1`
if [ $ret != 0 ]; then echo_i "failed"; fi
status=`expr $status + $ret`
key=`$KEYGEN -q -a RSASHA1 $czone`
echo_i "checking -p output time is accepted ($n)"
t=`$SETTIME -pA $key | sed 's/.*: //'`
$SETTIME -Psync "$t" $key > /dev/null 2>&1 || ret=1
n=`expr $n + 1`
if [ $ret != 0 ]; then echo_i "failed"; fi
status=`expr $status + $ret`
echo_i "checking -up output time is accepted ($n)"
t=`$SETTIME -upA $key | sed 's/.*: //'`
$SETTIME -Dsync "$t" $key > /dev/null 2>&1 || ret=1
n=`expr $n + 1`
if [ $ret != 0 ]; then echo_i "failed"; fi
status=`expr $status + $ret`
echo_i "exit status: $status"
[ $status -eq 0 ] || exit 1

View File

@ -250,14 +250,21 @@ This option sets the debugging level.
.UNINDENT
.SH TIMING OPTIONS
.sp
Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS. If the
argument begins with a \fB+\fP or \fB\-\fP, it is interpreted as an offset from
the present time. For convenience, if such an offset is followed by one
of the suffixes \fBy\fP, \fBmo\fP, \fBw\fP, \fBd\fP, \fBh\fP, or \fBmi\fP, then the offset is
computed in years (defined as 365 24\-hour days, ignoring leap years),
months (defined as 30 24\-hour days), weeks, days, hours, or minutes,
respectively. Without a suffix, the offset is computed in seconds. To
explicitly prevent a date from being set, use \fBnone\fP or \fBnever\fP\&.
Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS
(which is the format used inside key files),
or \(aqDay Mon DD HH:MM:SS YYYY\(aq (as printed by \fBdnssec\-settime \-p\fP),
or UNIX epoch time (as printed by \fBdnssec\-settime \-up\fP),
or the literal \fBnow\fP\&.
.sp
The argument can be followed by \(aq+\(aq or \(aq\-\(aq and an offset from the
given time. The literal \fBnow\fP can be omitted before an offset. The
offset can be followed by one of the suffixes \(aqy\(aq, \(aqmo\(aq, \(aqw\(aq, \(aqd\(aq,
\(aqh\(aq, or \(aqmi\(aq, so that it is computed in years (defined as 365 24\-hour
days, ignoring leap years), months (defined as 30 24\-hour days),
weeks, days, hours, or minutes, respectively. Without a suffix, the
offset is computed in seconds.
.sp
To unset a date, use \fBnone\fP or \fBnever\fP\&.
.INDENT 0.0
.TP
.B \-P date/offset

View File

@ -120,14 +120,21 @@ hardware service module (usually \fBpkcs11\fP).
.UNINDENT
.SH TIMING OPTIONS
.sp
Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS. If the
argument begins with a \fB+\fP or \fB\-\fP, it is interpreted as an offset from
the present time. For convenience, if such an offset is followed by one
of the suffixes \fBy\fP, \fBmo\fP, \fBw\fP, \fBd\fP, \fBh\fP, or \fBmi\fP, then the offset is
computed in years (defined as 365 24\-hour days, ignoring leap years),
months (defined as 30 24\-hour days), weeks, days, hours, or minutes,
respectively. Without a suffix, the offset is computed in seconds. To
explicitly prevent a date from being set, use \fBnone\fP or \fBnever\fP\&.
Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS
(which is the format used inside key files),
or \(aqDay Mon DD HH:MM:SS YYYY\(aq (as printed by \fBdnssec\-settime \-p\fP),
or UNIX epoch time (as printed by \fBdnssec\-settime \-up\fP),
or the literal \fBnow\fP\&.
.sp
The argument can be followed by \(aq+\(aq or \(aq\-\(aq and an offset from the
given time. The literal \fBnow\fP can be omitted before an offset. The
offset can be followed by one of the suffixes \(aqy\(aq, \(aqmo\(aq, \(aqw\(aq, \(aqd\(aq,
\(aqh\(aq, or \(aqmi\(aq, so that it is computed in years (defined as 365 24\-hour
days, ignoring leap years), months (defined as 30 24\-hour days),
weeks, days, hours, or minutes, respectively. Without a suffix, the
offset is computed in seconds.
.sp
To unset a date, use \fBnone\fP or \fBnever\fP\&.
.INDENT 0.0
.TP
.B \-P date/offset