#!/usr/bin/perl
# fixserial.pl (C)2008 by Jan-Piet Mens
# Read SOA from zone file and set new serial number. Prints result to stdout.

use POSIX qw(strftime);
use Net::DNS;
use Net::DNS::ZoneFile::Fast;
use strict;

die "Usage: $0 zonefile\n" unless ($ARGV[0]);

my $zonefile = $ARGV[0];
my $today = strftime("%Y%m%d", localtime);

my $zone = Net::DNS::ZoneFile::Fast::parse(file => $zonefile);

foreach my $rr (@$zone) {
	if ($rr->{type} eq 'SOA') {

		my $n;

		$_ = $rr->{serial};
		if (/(\d+)(\d\d)/) {
			my $olddate = $1;
			$n = ($olddate ne $today) ? -1 : $2;
		}
		my $serial = sprintf("${today}%02d", ++$n);

		$rr->{serial} = $serial;
	}
}
foreach my $rr (@$zone) {
	$rr->print;
}

