#!/usr/bin/perl use strict; use warnings; use Martnet::DDNS; use File::Temp qw/tempfile/; my $ddns = Martnet::DDNS->new(); my @vh = $ddns->get('_vhosts'); # For each virtual host, generate a vhost zone file if there isn't one my $changecount = 0; foreach my $i (@vh) { my $zf = "/var/lib/bind/bind/vhost/db.$i->{zone}"; unless ( -f $zf ) { print "Generating new zone file for $i->{zone}\n"; open(my $fh, ">", $zf) || die "Can't create output file $zf: $!"; create_zonefile($fh, $i); $changecount++; } } # For each vhost in /var/lib/bind/vhost, make sure it has an entry in the zone file. foreach my $i () { my ($zone) = ($i =~ /\/db.(.+)$/); next unless ($zone); unless (contains_zone($zone, @vh)) { print "Unlinking old zone file for $zone\n"; unlink($i); $changecount++; } } if ($changecount) { # If we made any changes, then generate the full vhost list my ($fh, $path) = tempfile(); foreach my $i (sort {$a->{zone} cmp $b->{zone}} @vh) { print $fh "zone \"$i->{zone}\" { type master; file \"/var/lib/bind/vhost/db.$i->{zone}\"; };\n"; } close $fh; print "Installing new vhost list\n"; system("install -o bind -g bind $path /var/lib/bind/vhost.zones.9"); print "Reloading DNS files\n"; system("rndc reload"); } exit 0; sub contains_zone { my ($zone, @zl) = @_; foreach my $i (@zl) { return 1 if ($i->{zone} eq $zone); } return 0; } sub create_zonefile { my ($fh, $i) = @_; my $zone = $i->{zone} . "."; my @now = localtime(); my $serial = sprintf("%.4d%.2d%.2d01", $now[5]+1900, $now[4]+1, $now[3]); print $fh <. ; # del-vhost . ; # list-vhosts ; \$TTL 43200 $zone IN SOA ns.martnet.com. root.ns.martnet.com. ( $serial ; Serial 43200 ; Refresh every 12 hours 3600 ; Retry every hour 604800 ; Expire after a week 43200 ) ; Negative Cache TTL 12 hours ; define name servers $zone IN NS ns.martnet.com. $zone IN NS ns1.martnet.com. $zone IN NS ns2.martnet.com. $zone IN NS ns3.martnet.com. $zone IN NS ns4.martnet.com. ; define localhost localhost IN A 127.0.0.1 ; define machine names $zone IN A 74.109.12.4 $zone IN MX 5 $zone $zone IN MX 10 mx2.martnet.com. $zone IN MX 15 mx3.martnet.com. *.$zone IN A 74.109.12.4 *.$zone IN MX 5 $zone *.$zone IN MX 10 mx2.martnet.com. *.$zone IN MX 15 mx3.martnet.com. EOF ; }