This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
dns_add_script [2009/08/14 20:45] jt created |
dns_add_script [2020/08/10 02:35] (current) |
||
---|---|---|---|
Line 1: | Line 1: | ||
<code perl> | <code perl> | ||
- | |||
#!/usr/bin/perl -w | #!/usr/bin/perl -w | ||
##Jason Thomas | ##Jason Thomas | ||
+ | ##Last Modified 20090819 | ||
+ | |||
use strict; | use strict; | ||
+ | use lib '/home/jthomas/lib/perl5/site_perl/5.8.8/'; | ||
use File::Copy; | use File::Copy; | ||
use IO::File; | use IO::File; | ||
- | ##use Text::Template; | + | use Text::Template; |
+ | use File::Grep qw( fgrep ); | ||
- | my $entry; | + | |
- | my $hostName; | + | ##my $repository = "/home/jthomas/projects/qsp_dns_migration/qsp.us.zone/"; |
- | my $ipAddress; | + | my $repository = "/home/jthomas/projects/dns/master/"; |
- | my $domainName; | + | |
- | my $subDomain; | + | |
- | my $dbZoneFile; | + | |
- | my $repository = "/home/jthomas/dns/master"; | + | |
my $dnsData = "data"; | 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 $!; | open (DATA, $dnsData), or die $!; | ||
my @dnsLine = <DATA>; | my @dnsLine = <DATA>; | ||
- | foreach $entry (@dnsLine){ | + | foreach my $entry (@dnsLine){ |
+ | |||
chomp ($entry); | chomp ($entry); | ||
- | ($hostName, $ipAddress) = split(' ', $entry); | + | |
- | $subDomain = findDomainName($hostName); | + | my ($hostName, $ipAddress) = split(' ', $entry); |
- | ## print "$domainName\n"; | + | my ($domainName, $subDomain) = findDomainName($hostName); |
- | checkZoneExist($domainName); | + | checkZoneExist($domainName, $subDomain, $ipAddress); |
- | + | ||
- | if ( defined($subDomain) && $subDomain ne "www"){ | + | |
- | addToZone($dbZoneFile, $subDomain, $ipAddress); | + | |
- | } | + | |
} | } | ||
close (DATA); | close (DATA); | ||
- | |||
exit (0); | exit (0); | ||
sub findDomainName{ | sub findDomainName{ | ||
- | my $hostName = shift; | + | my ($hostName) = @_; |
+ | my $domainName; | ||
my $subDomain; | my $subDomain; | ||
my $size; | my $size; | ||
Line 46: | Line 46: | ||
@tmp = split('\.', $hostName); | @tmp = split('\.', $hostName); | ||
$size = @tmp - 2; | $size = @tmp - 2; | ||
- | ## print "size of array: $size.\n"; | ||
- | if ( @tmp==2){ | + | if ( @tmp == 2){ |
- | $domainName = "$tmp[0].$tmp[1]"; | + | |
- | return undef; | + | return ($hostName, undef); |
- | ## print "$domainName\n"; | + | |
} | } | ||
+ | |||
else{ | else{ | ||
+ | |||
$domainName = "$tmp[@tmp-2].$tmp[@tmp-1]"; | $domainName = "$tmp[@tmp-2].$tmp[@tmp-1]"; | ||
Line 59: | Line 59: | ||
if ( ! defined($subDomain) ){ | if ( ! defined($subDomain) ){ | ||
+ | |||
$subDomain=$tmp[$counter]; | $subDomain=$tmp[$counter]; | ||
+ | |||
} | } | ||
+ | |||
else{ | else{ | ||
+ | |||
$subDomain="$subDomain.$tmp[$counter]"; | $subDomain="$subDomain.$tmp[$counter]"; | ||
+ | |||
} | } | ||
} | } | ||
- | ## print "$subDomain.$domainName\n"; | + | |
- | return $subDomain; | + | return ($domainName, $subDomain); |
} | } | ||
} | } | ||
Line 72: | Line 77: | ||
sub checkZoneExist{ | sub checkZoneExist{ | ||
- | my $domainName = shift; | + | my ($domainName, $subDomain, $ipAddress) = @_; |
my $dbZoneFile = "db.$domainName"; | my $dbZoneFile = "db.$domainName"; | ||
+ | my $userName = "jthomas"; | ||
+ | my $soa = "2009081801 "; | ||
if ( -e $repository.$dbZoneFile ){ | if ( -e $repository.$dbZoneFile ){ | ||
- | ## print "$dbZoneFile exists\n"; | + | |
+ | ## write subdomain to file if file exists; | ||
+ | addToZone($dbZoneFile, $subDomain, $ipAddress); | ||
+ | |||
} | } | ||
- | else{ | + | |
- | ## print "$dbZoneFile does not exists\n"; | + | elsif ( (! defined($subDomain)) || $subDomain eq ""){ |
+ | |||
+ | my ($tabs) = tabLength($domainName."."); | ||
+ | makeZone("customArecord.tmpl", $dbZoneFile, {soa => \$soa, userName => \$userName, domain => \"$domainName.", tabs => \$tabs, CUSTOMIP => $ipAddress }); | ||
+ | |||
} | } | ||
- | + | ||
- | return $dbZoneFile; | + | |
- | + | ||
} | } | ||
sub makeZone{ | 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"; | ||
} | } | ||
Line 96: | Line 118: | ||
sub addToZone{ | sub addToZone{ | ||
- | $dbZoneFile = shift; | ||
- | $subDomain = shift; | ||
- | $ipAddress = shift; | ||
- | print "$subDomain\t\tIN\tA\t$ipAddress\n"; | + | 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> | </code> |