Dns add script
#!/usr/bin/perl -w
##Jason Thomas
##Last Modified 20090819
use strict;
use lib '/home/jthomas/lib/perl5/site_perl/5.8.8/';
use File::Copy;
use IO::File;
use Text::Template;
use File::Grep qw( fgrep );
##my $repository = "/home/jthomas/projects/qsp_dns_migration/qsp.us.zone/";
my $repository = "/home/jthomas/projects/dns/master/";
my $dnsData = "data";
##currently designed to read from file. however if fqdn is not before fqhn, it will not be able write
##the entry until db.fqdn is created
open (DATA, $dnsData), or die $!;
my @dnsLine = <DATA>;
foreach my $entry (@dnsLine){
chomp ($entry);
my ($hostName, $ipAddress) = split(' ', $entry);
my ($domainName, $subDomain) = findDomainName($hostName);
checkZoneExist($domainName, $subDomain, $ipAddress);
}
close (DATA);
exit (0);
sub findDomainName{
my ($hostName) = @_;
my $domainName;
my $subDomain;
my $size;
my $counter;
my @tmp;
@tmp = split('\.', $hostName);
$size = @tmp - 2;
if ( @tmp == 2){
return ($hostName, undef);
}
else{
$domainName = "$tmp[@tmp-2].$tmp[@tmp-1]";
for ($counter = 0; $counter < $size; $counter++){
if ( ! defined($subDomain) ){
$subDomain=$tmp[$counter];
}
else{
$subDomain="$subDomain.$tmp[$counter]";
}
}
return ($domainName, $subDomain);
}
}
sub checkZoneExist{
my ($domainName, $subDomain, $ipAddress) = @_;
my $dbZoneFile = "db.$domainName";
my $userName = "jthomas";
my $soa = "2009081801 ";
if ( -e $repository.$dbZoneFile ){
## write subdomain to file if file exists;
addToZone($dbZoneFile, $subDomain, $ipAddress);
}
elsif ( (! defined($subDomain)) || $subDomain eq ""){
my ($tabs) = tabLength($domainName.".");
makeZone("customArecord.tmpl", $dbZoneFile, {soa => \$soa, userName => \$userName, domain => \"$domainName.", tabs => \$tabs, CUSTOMIP => $ipAddress });
}
}
sub makeZone{
my ($templateSource, $dbZoneFile, $fillInHash) = @_;
my $template = Text::Template->new(SOURCE => $templateSource) or die "Couldn't construct template: $Text::Template::ERROR";
my $result = $template->fill_in(HASH => $fillInHash);
if (! defined $result) {
die "Couldn't fill in template: $Text::Template::ERROR";
}
open(DBFILE, ">$repository/$dbZoneFile") , or die $! ;
print DBFILE $result;
close (DBFILE);
print "\[Info\] Zone file $dbZoneFile created.\n";
}
sub addToZone{
my ($dbZoneFile, $subDomain, $ipAddress) = @_ ;
if ( defined($subDomain) && $subDomain ne "www"){
if ( fgrep {/^$subDomain\t/} $repository.$dbZoneFile ){
print "Record $subDomain is already in $dbZoneFile \n";
}
else {
my ($tabs) = tabLength($subDomain);
open(DBFILE, ">>$repository/$dbZoneFile") , or die $!;
print DBFILE "$subDomain$tabs"."IN\tA\t$ipAddress\n";
close (DBFILE);
}
}
}
sub tabLength{
my ($word) = @_;
my $tabs = "\t" x (((32 - length($word) + 6) / 8));
if (length($tabs) == 0){
$tabs = "\t";
}
return $tabs;
}
###########################################################################
# Help, info and correctional information.
###########################################################################
sub subUsage {
print "\nUsage: addZone.pl \[-Dn?\] <username> <hostname> <ipaddress>\n";
print " newZone.pl <username> <domain> <IP address>\n";
print "addZone will create a new zone file, based on domain name. It will also add a new zone to the\n";
print "list of zones governed by named-zones.conf. This file will be created and sent, if needed, by dnsPush.\n";
print "Only use this to add a new zone and make sure you have the correct type (virtual, www or blank).\n\n";
print "-D Show debug information while running.\n";
print "-n Dryrun mode, make no changes, displays final zone file on screen.\n";
print "-? Help page, displays this page.\n\n";
exit(0);
}