1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
#!/usr/bin/perl -wT
# Copyright (c) 2004, 2005 Peter Palfrader <peter@palfrader.org>
# All rights reserved.
=pod
=head1 NAME
makezonefile - create config file for bind
=head1 SYNOPSIS
makezonefile
=head1 DESCRIPTION
makezonefile reads from STDIN a list of domains and
their assoziated nameservers; one domain per line, the nameservers
seperated by whitespace.
Example:
debian.org murphy.debian.org auric.debian.org ns2.cistron.nl ns.hands.com
palfrader.org gw.frosty-geek.net ns1.3node.com ns.sourcecode.at i-got-this.ns.for-beer.org
3node.com ns2.3node.com ns1.3node.com
For each domain it will then look whether this host's name (as configured in
the @THISNAMES variable) appears in the list of nameservers and if that is the
case add a slave entry to the file hardcoded in the script. Master Nameserver is hardcoded too.
Afterwards a bind9 reload will be issued.
The script is typicalle called from ssh (using authorized keys with command=script).
=head1 OPTIONS
none
=head1 AUTHOR
Peter Palfrader E<lt>pp@3node.com<gt>
=head1 REQUIREMENTS
none but perl
=head1 SEE ALSO
Ask author.
=cut
use strict;
use English;
$ENV{'PATH'} = '/bin:/usr/bin';
delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
my $NAMEDCONF = '/etc/bind/named.conf.ldapzones.slave.pushed';
my @RELOAD = qw{/etc/init.d/bind9 reload};
my @THISNAMES = qw{opium.multi24.com.};
#my @THISNAMES = qw{seppia.noreply.org. ns3.noreply.org.};
#my @THISNAMES = qw{redeemer.devspread.org.};
my $date = localtime();
open (CONF, ">$NAMEDCONF") or
die ("Cannot open $NAMEDCONF: $!\n");
print CONF << "EOF";
// conf file for bind
// $date
// automatically created by $PROGRAM_NAME from stdin (probably called by ssh)
// vim:set syn=named:
EOF
my @lines = <>;
DOMAIN:
for my $line (@lines) {
chomp ($line);
my @part = split (/\s+/, $line);
my $domain = shift @part;
my @masters = split /\|/, shift @part;
unless (defined $domain && ($domain =~ /^[a-z0-9.-]+$/)) {
warn "Skipping $domain: bad name\n";
next;
};
if (scalar @masters == 0) {
warn "Skipping $domain: No masters\n";
next;
};
for my $master (@masters) {
unless (defined $master && ($master =~ /^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/)) {
warn "Skipping $domain: bad master '$master'\n";
next DOMAIN;
};
};
my $this_ns = 0;
for my $ns (@part) {
for my $my_name (@THISNAMES) {
$this_ns |= ($ns eq $my_name);
};
};
next unless $this_ns;
print CONF << "EOF";
zone "$domain" {
type slave;
file "ldapzones.slave.pushed-$domain";
allow-transfer { "none"; };
allow-query { any; };
masters {
EOF
for my $master (@masters) {
print CONF " $master;\n";
};
print CONF << "EOF";
};
};
EOF
};
close (CONF);
exec(@RELOAD);
|