This shows you the differences between two versions of the page.
dns_add_script [2009/08/18 21:55] jt |
dns_add_script [2020/08/10 02:35] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | <code perl> | ||
- | #!/usr/bin/perl -w | ||
- | ##Jason Thomas | ||
- | 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/dns/master/"; | ||
- | my $dnsData = "data"; | ||
- | |||
- | |||
- | |||
- | open (DATA, $dnsData), or die $!; | ||
- | my @dnsLine = <DATA>; | ||
- | |||
- | foreach my $entry (@dnsLine){ | ||
- | |||
- | chomp ($entry); | ||
- | my ($hostName, $ipAddress) = split(' ', $entry); | ||
- | ## if ( !defined($ipAddress) ) {print "$hostName has no IP Address\n"; exit 0;} | ||
- | my ($domainName, $subDomain) = findDomainName($hostName); | ||
- | my $dbZoneFile = checkZoneExist($domainName, $subDomain, $ipAddress); | ||
- | addToZone($dbZoneFile, $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 ){ | ||
- | ## print "File Exists!"; | ||
- | } | ||
- | |||
- | else{ | ||
- | my ($tabs) = tabLength($domainName."."); | ||
- | makeZone("customArecord.tmpl", $dbZoneFile, {soa => \$soa, userName => \$userName, domain => \"$domainName.", tabs => \$tabs, CUSTOMIP => $ipAddress }); | ||
- | } | ||
- | |||
- | return $dbZoneFile; | ||
- | } | ||
- | |||
- | |||
- | |||
- | 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); | ||
- | |||
- | 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); | ||
- | } | ||
- | |||
- | </code> |