summaryrefslogtreecommitdiff
path: root/bin/make-bindconfig-from-ldap-HOSTNAME
blob: a45b2364b5e7d83c78c5d2fc6cef7441ad4f32be (plain)
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);