#!/usr/bin/env perl # Public domain. # Like any other piece of software (and information generally), this script # comes with NO WARRANTY. # This is version 20191009 of openbsd-release-version.pl. use strict; use warnings FATAL => 'all'; use Net::DNS; use Time::Piece; use Time::Seconds; use Time::Local; use constant EPOCH => timegm(0,0,12,17,10,1858); # MJD my $response = undef; my $rr = undef; my $ch = -1; my $len = -1; my $dns = Net::DNS::Resolver->new( recurse => 1, debug => 0, ); my $tp = Time::Piece->new(EPOCH); my $h = undef; my $j = 4; my $v = 2; eval { $response = $dns->query( 'openbsdversion.bze.ro', 'TXT' ); }; if ($@) { die($!); } if (!defined($response)) { die('no response'); } elsif ('NOERROR' ne $response->header->rcode) { die('error in response'); } elsif (1 != scalar($response->answer)) { die('incorrect number of answers received'); } eval { $rr = ($response->answer)[0]; }; if ($@) { die($!); } if (!defined($rr)) { die('empty response'); } if ('TXT' ne $rr->type) { die('incorrect resource record answer type'); } $len = length($rr->txtdata) - 1; if (1 > $len) { die('response length not long enough'); } $ch = unpack("x$len A", $rr->txtdata); if (',' ne $ch) { die('corrupt response received'); } $ch = index($rr->txtdata, ':'); if (0 > $ch) { die('corrupt response received'); } $len = unpack("A$ch", $rr->txtdata); $len += $ch; $ch++; while ($ch < $len) { $h = hex unpack("x$ch A$j", $rr->txtdata); $tp += ONE_DAY * $h; print $tp->ymd, sprintf(" %0.1f", $v), "\n"; $ch += $j; $j = 2; $v += 0.1; } exit(0); # END