aboutsummaryrefslogtreecommitdiffstats
path: root/tools/generate-dnsrr.pl
diff options
context:
space:
mode:
Diffstat (limited to 'tools/generate-dnsrr.pl')
-rwxr-xr-xtools/generate-dnsrr.pl147
1 files changed, 147 insertions, 0 deletions
diff --git a/tools/generate-dnsrr.pl b/tools/generate-dnsrr.pl
new file mode 100755
index 0000000..789f268
--- /dev/null
+++ b/tools/generate-dnsrr.pl
@@ -0,0 +1,147 @@
+#!/usr/bin/perl -I /root/tgmanage
+#
+# USAGE:
+# Generate BIND Zone-file data based on the file hosts-to-add.txt
+# cat hosts-to-add.txt | tools/generate-dnsrr.pl
+#
+# Generate input data for nsupdate, to add FORWARD records based on hosts-to-add.txt
+# cat hosts-to-add.txt | tools/generate-dnsrr.pl --domain foo.tgXX.gathering.org -ns
+#
+# Generate input data for nsupdate, to add REVERSE records based on hosts-to-add.txt
+# cat hosts-to-add.txt | tools/generate-dnsrr.pl --domain foo.tgXX.gathering.org -ns -rev
+#
+# Generate input data for nsupdate, to DELETE forward records based on hosts-to-add.txt
+# cat hosts-to-DELETE.txt | tools/generate-dnsrr.pl --domain foo.tgXX.gathering.org -ns -del
+#
+# Generate input data for nsupdate, to DELETE reverse records based on hosts-to-add.txt
+# cat hosts-to-DELETE.txt | tools/generate-dnsrr.pl --domain foo.tgXX.gathering.org -ns -rev -del
+#
+# Command-syntax to send this to nsupdate, running it on the DNS server:
+# cat file.txt | tools/generate-dnsrr.pl --dom foo -ns | ssh $dnsserver "nsupdate -k /etc/bind/Kdhcp_updater.+157+XXXXX"
+#
+# Format of input:
+# hostname ipv4-adress ipv6-address
+# If any of ipv4-address or ipv6-address are NOT set for the host, specify "nope"
+# Lines starting with # will (should) be skipped (comments)
+#
+# Example:
+#
+# host1 192.168.0.1 2001:db8:f00::1
+# host2 nope 2001:db8:f00::2
+# host3 192.168.0.3 nope
+# # comment, to be ignored.
+# host4 192.168.0.4
+
+use strict;
+use warnings;
+use lib '..';
+BEGIN {
+ require "include/config.pm";
+ eval {
+ require "include/config.local.pm";
+ };
+}
+use Net::IP;
+use Getopt::Long;
+
+my ($delete, $auto, $nsupdate, $reverse, $domain);
+
+if (@ARGV > 0) {
+ GetOptions(
+ 'del|delete' => \$delete,
+ 'a|auto' => \$auto,
+ 'ns|nsupdate' => \$nsupdate,
+ 'r|reverse' => \$reverse,
+ 'domain=s' => \$domain
+ )
+}
+
+if ($nsupdate || $reverse){
+ unless (defined($domain)){
+ print "Missing domain.\n";
+ exit 1 unless defined($domain);
+ }
+}
+
+$domain = "." . $domain if defined($domain);
+
+print "server $nms::config::pri_ptr\n" if ($nsupdate || $reverse);
+
+while (<STDIN>) {
+ next if /^(#|\s+$)/; # skip if comment, or blank line
+
+ my ($hostname, $ipv4, $ipv6) = split;
+ $hostname = lc($hostname);
+
+ unless ($ipv6){
+ if ($auto){
+ # Get IPv6-address based on IPv4-address
+
+ my ($first, $second, $third, $fourth) = split('\.', $ipv4);
+ $ipv6 = $nms::config::base_ipv6net . $third . "::" . $fourth;
+ }
+ }
+
+ if ($reverse){
+ # print ptr
+ print_ptr($hostname, $ipv4, $ipv6);
+ } else {
+ # print forward
+ print_fwd($hostname, $ipv4, $ipv6);
+ }
+}
+
+sub print_ptr{
+ my ($hostname, $ipv4, $ipv6) = @_;
+
+ # IPv4
+ unless ( $ipv4 eq "nope" ) {
+ my $v4 = new Net::IP($ipv4);
+
+ print "prereq nxdomain " . $v4->reverse_ip() . "\n" unless $delete;
+ print "update add " . $v4->reverse_ip() . " 3600 IN PTR " . $hostname . $domain .".\n" unless $delete;
+ print "update delete " . $v4->reverse_ip() . " IN PTR\n" if $delete;
+ print "send\n";
+ }
+
+ # IPv6
+ if (( not ($ipv6 eq "nope") ) && ( $ipv6 )) {
+ my $v6 = new Net::IP($ipv6);
+
+ print "prereq nxdomain " . $v6->reverse_ip() . "\n" unless $delete;
+ print "update add " . $v6->reverse_ip() . " 3600 IN PTR " . $hostname . $domain . ".\n" unless $delete;
+ print "update delete " . $v6->reverse_ip() . " IN PTR\n" if $delete;
+ print "send\n";
+ }
+}
+
+sub print_fwd{
+ my ($hostname, $ipv4, $ipv6) = @_;
+
+ if ($nsupdate){
+
+ unless ( $ipv4 eq "nope" ) {
+ # IPv4
+ print "prereq nxrrset " . $hostname . $domain . " IN A\n" unless $delete;
+ print "update add " . $hostname . $domain . " 3600 IN A $ipv4\n" unless $delete;
+ print "update delete " . $hostname . $domain . " IN A\n" if $delete;
+ print "send\n";
+ }
+ if (( not ($ipv6 eq "nope") ) && ( $ipv6 )) {
+ # IPv6
+ print "prereq nxrrset " . $hostname . $domain . " IN AAAA\n" unless $delete;
+ print "update add " . $hostname . $domain . " 3600 IN AAAA $ipv6\n" unless $delete;
+ print "update delete " . $hostname . $domain . " IN AAAA\n" if $delete;
+ print "send\n";
+ }
+ } else {
+ # IPv4
+ unless ( $ipv4 eq "nope" ) {
+ printf ("%-24s%s\t%s\t%s\n", $hostname, "IN", "A", $ipv4);
+ }
+ # IPv6
+ if (( not ($ipv6 eq "nope") ) && ( $ipv6 )) {
+ printf ("%-24s%s\t%s\t%s\n", $hostname, "IN", "AAAA", $ipv6) if ($ipv6);
+ }
+ }
+}