aboutsummaryrefslogtreecommitdiffstats
path: root/bootstrap/make-missing-conf.pl
blob: 0159452ac5261d2bd945bb5b884034a4c58ee34d (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
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlig
#!/usr/bin/perl -I /root/tgmanage
use strict;
use Net::IP;
use NetAddr::IP;
use POSIX qw(strftime);

BEGIN {
        require "include/config.pm";
        eval {
                require "include/config.local.pm";
        };
}

my $serial = strftime("%Y%m%d", localtime(time())) . "01";

unless ( (($#ARGV == 0 ) || ( $#ARGV == 1))
	&& (( $ARGV[0] eq "master" ) || ( $ARGV[0] eq "slave" )) )
{
	print STDERR "Invalid usage!\ncat netnames.txt | $0 <master|slave> [basedir]\n";
	exit 1;
}

my $role = $ARGV[0];

my $base = "/etc";
$base = $ARGV[1] if $#ARGV == 1;
$base .= "/" if not $base =~ m/\/$/ and not $base eq "";


print STDERR "Role is " . $role . "\n";
print STDERR "Base dir is " . $base . "\n";

my $bind_base =  $base . "bind/";
my $dhcpd_base = $base . "dhcp/";

my $bind_conf_master = $bind_base . "conf-master/";
my $bind_conf_slave  = $bind_base . "conf-slave/";

my $base_ipv4 = Net::IP->new( $nms::config::base_ipv4net );
my ($cp_oct, $cs_oct, $ct_oct) = ($nms::config::base_ipv4net =~ m/^(\d+)\.(\d+)\.(\d+)\..*/);

while ( <STDIN> ){
	next if ( $_ =~ m/^(#|$)/); # comment or blank line
	my $line = $_;
	chomp $line;
	# <v4 net> <v6 net> <network-name>
	# 151.216.129.0/26 2a02:ed02:129a::/64 noc
	# we assume not smaller than /64 on v6
	die ("Invalid format on input.\n") if not $line =~ m/^((\d+\.){3}\d+\/\d+)\s+(([a-fA-F0-9]+\:){1,4}\:\/\d+)\s+([\w|-]+).*/;
	my ( $v4_net, $v6_net, $name ) = ( $1, $3, $5 );
	
	my $master_config =  $bind_conf_master . $name . ".conf";
	my $slave_config =  $bind_conf_slave . $name . ".conf";
	my $zone_file = $bind_base . "dynamic/$name.$nms::config::tgname.gathering.org.zone";
	
	# DHCP4
	my $dhcp_dynconf_dir =  $dhcpd_base . "conf-v4/";
	my $dhconfig = $dhcp_dynconf_dir . $name . ".conf";

	if ( not -f $dhconfig ){
		print STDERR "Creating file " . $dhconfig . "\n";
		
		my $network = Net::IP->new($v4_net)->ip();
		my $netmask = Net::IP->new($v4_net)->mask();
		(my $first = NetAddr::IP->new($v4_net)->nth(3)) =~ s/\/[0-9]{1,2}//; # we reserve the three first addresses 
		(my $last = NetAddr::IP->new($v4_net)->last()) =~ s/\/[0-9]{1,2}//;
		(my $gw = NetAddr::IP->new($v4_net)->first()) =~ s/\/[0-9]{1,2}//;

		open DFILE, ">" . $dhconfig or die ( $! . " " . $dhconfig);

		print DFILE <<"EOF";
zone $name.$nms::config::tgname.gathering.org {
	primary $nms::config::ddns_to;
	key DHCP_UPDATER;
}
subnet $network netmask $netmask {
	option subnet-mask $netmask;
	option routers $gw;
	option domain-name "$name.$nms::config::tgname.gathering.org";
	ddns-domainname "$name.$nms::config::tgname.gathering.org";
	range $first $last;
}

EOF

		close DFILE;
	}
	
	# DHCP6
	$dhcp_dynconf_dir =  $dhcpd_base . "conf-v6/";
	$dhconfig = $dhcp_dynconf_dir . $name . ".conf";

	if ( not -f $dhconfig ){
		print STDERR "Creating file " . $dhconfig . "\n";
		
		my $network = Net::IP->new($v6_net)->short();
		my ($first, $last) = ("1000", "9999");
		
		open DFILE, ">" . $dhconfig or die ( $! . " " . $dhconfig);
			
		print DFILE <<"EOF";
zone $name.$nms::config::tgname.gathering.org {
	primary $nms::config::ddns_to;
	key DHCP_UPDATER;
}
subnet6 $v6_net {
        option domain-name "$name.$nms::config::tgname.gathering.org";

	range6 ${network}${first} ${network}${last};
}

EOF

		close DFILE;
	}

	# Create zone files for bind9 on master/primary
	if ( ( not -f $zone_file ) && ( $role eq "master" ) )
	{
		print STDERR "Creating file " . $zone_file . "\n";
		open ZFILE, ">" . $zone_file or die ( $! . " " . $zone_file);
		print ZFILE << "EOF";
; Base reverse zones are updated from dhcpd -- DO NOT TOUCH!
\$TTL 3600
@	IN	SOA	$nms::config::pri_hostname.$nms::config::tgname.gathering.org.	abuse.gathering.org. (
                        $serial   ; serial
                        3600 ; refresh
                        1800 ; retry
                        608400 ; expire
                        3600 ) ; minimum and default TTL

		IN	NS	$nms::config::pri_hostname.$nms::config::tgname.gathering.org.
		IN	NS	$nms::config::sec_hostname.$nms::config::tgname.gathering.org.
\$ORIGIN $name.$nms::config::tgname.gathering.org.
EOF
		close ZFILE;
	}
	
	# Create bind9 configuration files for zones.
	my $bind_file = "";
	$bind_file = $master_config if ( $role eq "master");
	$bind_file = $slave_config if ( $role eq "slave");
	die ("WTF, role does not match 'master' or 'slave'" ) if ( $bind_file eq "");

	if ( not -f $bind_file ){
		print STDERR "Creating file " . $bind_file . "\n";
		open NFILE, ">" . $bind_file or die ( $! . " " . $bind_file);

		print NFILE <<"EOF";
zone "$name.$nms::config::tgname.gathering.org" {
	allow-transfer { ns-xfr; };
EOF

		if ( $role eq "master" ) {
			print NFILE <<"EOF";
	type master;
	notify yes;
	allow-update { key DHCP_UPDATER; };
	file "dynamic/$name.$nms::config::tgname.gathering.org.zone";
};
EOF
		} else {
			print NFILE <<"EOF";
	type slave;
	notify no;
	masters { master_ns; };
	file "slave/$name.$nms::config::tgname.gathering.org.zone";
};
EOF
		}

		close NFILE;
	}
}