#!/usr/bin/perl -w
use strict;

# The format of a tinydns SOA record is:
#    Zfqdn:mname:rname:ser:ref:ret:exp:min:ttl:timestamp:lo
# This program acts as a filter, changing the ser field in all Z records.
# It will set ser to be the current timestamp in YYYYMMDDnn format, and
# update the nn section if it is already the correct format.
# If nn is already 99 it will exit with an error.

my ($basedate,$line,$updatenum,@fields);
@fields=localtime;
$basedate=sprintf "%04u%02u%02u",1900+$fields[5],1+$fields[4],$fields[3];
while(defined($line=<>)) {
	if("Z" eq substr($line,0,1)) {
		@fields=split /:/,$line,-1;
		if(10==length $fields[3] and $basedate eq substr($fields[3],0,8)) {
			$updatenum=substr($fields[3],8);
			die "invalid updatenum $updatenum" if($updatenum =~ /\D/s);
			die "updatenum already 99" if(99==$updatenum);
			$fields[3]=sprintf "%s%02u",$basedate,1+$updatenum;
		} else {
			$fields[3]=$basedate."00";
		}
		$line=join(":",@fields);
	}
	print $line;
}
0;
