ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/FreeBSDAdmin/DNS/reverse.pl
Revision: 993
Committed: 2008-02-02T19:16:10-08:00 (17 years, 5 months ago) by douglas
Content type: text/x-perl
File size: 2419 byte(s)
Log Message:
Support for also notify?

File Contents

# User Rev Content
1 douglas 846 #!/usr/local/bin/perl
2     # Reverse
3     #
4 douglas 845 # Douglas Thrift
5     #
6     # $Id$
7    
8 douglas 846 use strict;
9     use warnings;
10     use Net::hostent;
11     use POSIX qw(:time_h :unistd_h);
12     use Socket;
13    
14     my @hostnames;
15    
16 douglas 931 open DAT, "$ENV{HOME}/.reverse.dat" or die "$0: $!";
17 douglas 846
18     while (<DAT>)
19 douglas 845 {
20 douglas 853 $hostnames[$#hostnames + 1] = $& if (/^[^#].*$/);
21 douglas 845 }
22    
23 douglas 846 close DAT;
24 douglas 845
25 douglas 846 my $namedb = geteuid == 0 ? '/etc/namedb' : '.';
26    
27     open CONF, "$namedb/named.conf" or die "$0: $!";
28    
29     my $conf;
30    
31     while (<CONF>)
32 douglas 845 {
33 douglas 846 $conf .= $_;
34 douglas 845 }
35    
36 douglas 846 my $updated = 0;
37 douglas 845
38 douglas 846 for my $hostname (@hostnames)
39     {
40     my $host = gethostbyname $hostname;
41    
42     if (defined $host)
43     {
44     my $address = inet_ntoa($host->addr);
45     my $zone = join ('.', reverse unpack('C4', $host->addr)) . '.in-addr.arpa';
46    
47     $host = gethostbyaddr ($host->addr, AF_INET);
48    
49     if (!defined ($host) || $host->name ne $hostname)
50     {
51 douglas 896 open ZONE, '>', "$namedb/reverse/$zone" or die "$0: $!";
52 douglas 846
53     my $serialnum = strftime('%Y%m%d01', localtime);
54    
55 douglas 993 if ($conf =~ /\n# $hostname\nzone "((\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.in-addr\.arpa)" {\n\ttype master;\n\tfile "reverse\/\1";\n};\n/)
56 douglas 846 {
57     next if ($1 eq $zone);
58    
59 douglas 993 my $oldaddress = "$5.$4.$3.$2";
60 douglas 846 my $oldzone = $1;
61 douglas 896 my $oldzonefile = "$namedb/reverse/$oldzone";
62 douglas 846
63     open OLDZONE, $oldzonefile;
64    
65 douglas 993 $oldaddress =~ s/\./\\./g;
66 douglas 846 $oldzone =~ s/\./\\./g;
67    
68     while (<OLDZONE>)
69     {
70     s/$oldzone/$zone/;
71     s/\d{10} ; serial$/$serialnum ; serial/;
72    
73     print ZONE;
74     }
75    
76     close OLDZONE;
77     unlink $oldzonefile;
78    
79 douglas 993 $conf =~ s/\t$oldaddress;/\t$address;/g;
80     $conf =~ s/"((?:reverse\/)?)$oldzone"/"$1$zone"/g;
81 douglas 846 }
82     else
83     {
84     print ZONE "\$ORIGIN .
85 douglas 845 \$TTL 3600 ; 1 hour
86 douglas 846 $zone IN SOA ns.douglasthrift.net. admin.douglasthrift.net. (
87     $serialnum ; serial
88 douglas 845 7200 ; refresh (2 hours)
89     3600 ; retry (1 hour)
90     604800 ; expire (1 week)
91     3600 ; minimum (1 hour)
92     )
93     NS ns.douglasthrift.net.
94     PTR $hostname.
95 douglas 846 ";
96 douglas 845
97 douglas 846 $conf .= "
98 douglas 845 # $hostname
99 douglas 846 zone \"$zone\" {
100 douglas 845 type master;
101 douglas 896 file \"reverse/$zone\";
102 douglas 845 };
103 douglas 846 ";
104     }
105    
106     close ZONE;
107    
108     $updated = 1;
109     }
110     }
111 douglas 896 elsif ($conf =~ s/\n# $hostname\nzone "(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\.in-addr\.arpa)" {\n\ttype master;\n\tfile "reverse\/\1";\n};\n//)
112 douglas 846 {
113 douglas 896 unlink "$namedb/reverse/$1";
114 douglas 846
115     $updated = 1;
116     }
117     }
118    
119     if ($updated)
120     {
121     open CONF, '>', "$namedb/named.conf" or die "$0: $!";
122     print CONF $conf;
123     }
124    
125     close CONF;
126 douglas 896 exec {'/usr/sbin/rndc'} 'rndc', 'reconfig' or die "$0: $!" if ($updated && geteuid == 0);

Properties

Name Value
svn:executable *
svn:keywords Id