2014-02-07 20:10:51 +00:00
|
|
|
#!/usr/bin/env perl
|
2014-02-07 23:52:10 +00:00
|
|
|
# License: 3-Clause BSD. Author: Matthew Connelly.
|
|
|
|
# This is a (formerly Bash, now Perl) script for managing in-addr.arpa and ip6.arpa zones.
|
2014-02-07 23:53:26 +00:00
|
|
|
# If you have any questions or issues, open an issue at https://bitbucket.org/MaffC/script-collection/issues
|
2014-02-07 20:10:51 +00:00
|
|
|
|
|
|
|
use strict;
|
|
|
|
use warnings;
|
|
|
|
|
2014-02-08 00:58:56 +00:00
|
|
|
package DNS::Reverse::Manager;
|
|
|
|
|
2014-02-08 01:02:42 +00:00
|
|
|
use Data::Validate::Domain qw(is_domain); #for validating domains
|
|
|
|
use Data::Validate::IP qw(is_public_ipv4 is_public_ipv6); #for validating v4/v6 addresses
|
|
|
|
use Getopt::Long qw(:config posix_default bundling pass_through); #for intelligently handling cli arguments
|
|
|
|
use Net::IP; #for converting IPs to their reverse zones
|
2014-02-07 23:52:10 +00:00
|
|
|
use Data::Dumper;
|
|
|
|
|
|
|
|
#conf
|
|
|
|
my $def_rdns = 'hosted-by.mycompany.com';
|
|
|
|
my $def_dns = '8.8.8.8';
|
|
|
|
|
|
|
|
#variables for arguments
|
|
|
|
our $verify = '';
|
|
|
|
our $force = '';
|
|
|
|
our $reset = '';
|
|
|
|
our $nosync = '';
|
|
|
|
our $fsync = '';
|
|
|
|
our $delptr = '';
|
|
|
|
our $prefixlen = 64;
|
|
|
|
|
|
|
|
#functions
|
|
|
|
#validation, data rejigging and output
|
|
|
|
sub validate_domain {
|
|
|
|
my $domain = shift;
|
|
|
|
return 1 if is_domain $domain;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
sub is_ip {
|
|
|
|
#returns 0 on invalid IP, 1 on v4, 2 on v6.
|
|
|
|
my $ip = shift;
|
|
|
|
return 2 if is_public_ipv6 $ip;
|
|
|
|
return 1 if is_public_ipv4 $ip;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
sub get_arpa {
|
|
|
|
my $ip = shift;
|
|
|
|
if(is_public_ipv4 $ip) {
|
|
|
|
$ip =~ m/^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)$/;
|
|
|
|
return ($4, "$3.$2.$1.in-addr.arpa");
|
|
|
|
}
|
2014-02-08 00:10:22 +00:00
|
|
|
my $len = ($prefixlen/2);
|
|
|
|
Net::IP->new($ip)->reverse_ip =~ /^(.*)\.(.{$len}ip6\.arpa)\.$/;
|
2014-02-07 23:52:10 +00:00
|
|
|
return ($1,$2);
|
|
|
|
}
|
|
|
|
sub nicedie {
|
2014-02-08 00:58:56 +00:00
|
|
|
print shift."\n";
|
2014-02-07 23:52:10 +00:00
|
|
|
exit 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
#main
|
2014-02-08 00:58:56 +00:00
|
|
|
#do argument parsing, all unknown arguments get left in @ARGV so I can `shift`.
|
|
|
|
GetOptions
|
2014-02-07 23:52:10 +00:00
|
|
|
'v|verify-rdns' => \$verify,
|
|
|
|
'dns-server=s' => \$def_dns,
|
|
|
|
'f|force' => \$force,
|
|
|
|
'r|reset' => \$reset,
|
|
|
|
'default=s' => \$def_rdns,
|
|
|
|
'd|no-sync' => \$nosync,
|
|
|
|
's|force-sync' => \$fsync,
|
2014-02-08 00:58:56 +00:00
|
|
|
'R|remove-ptr' => \$delptr;
|
2014-02-07 20:10:51 +00:00
|
|
|
|
2014-02-08 00:58:56 +00:00
|
|
|
#get IP and domain, validate.
|
2014-02-07 23:52:10 +00:00
|
|
|
my $ip = shift or nicedie "No IP given!";
|
2014-02-08 00:58:56 +00:00
|
|
|
$prefixlen = $1 if $ip =~ s/\/([0-9]+)//; #split off prefixlen (if given) into variable for later use
|
|
|
|
nicedie "Invalid IP address '$ip'!" unless is_ip $ip;
|
|
|
|
my $domain = shift or nicedie "No FQDN given!" unless $fsync || $reset || $delptr; #conditionally allow the user to not specify a fqdn
|
|
|
|
nicedie "Invalid FQDN '$domain'!" if defined $domain && !validate_domain $domain;
|