diff options
Diffstat (limited to 'bootstrap/make-missing-conf.pl')
-rwxr-xr-x | bootstrap/make-missing-conf.pl | 125 |
1 files changed, 79 insertions, 46 deletions
diff --git a/bootstrap/make-missing-conf.pl b/bootstrap/make-missing-conf.pl index 598964f..e45a473 100755 --- a/bootstrap/make-missing-conf.pl +++ b/bootstrap/make-missing-conf.pl @@ -1,5 +1,6 @@ #!/usr/bin/perl -I /root/tgmanage use strict; +use Net::IP; BEGIN { require "include/config.pm"; @@ -8,10 +9,6 @@ BEGIN { }; } - -use Net::IP; -use Net::IP qw(:PROC); - my $serial = strftime("%Y%m%d", localtime(time())) . "01"; unless ( (($#ARGV == 0 ) || ( $#ARGV == 1)) @@ -34,51 +31,88 @@ print STDERR "Base dir is " . $base . "\n"; my $bind_base = $base . "bind/"; my $dhcpd_base = $base . "dhcp/"; -my $dhcp_dynconf_dir = $dhcpd_base . "conf.d/"; my $bind_conf_master = $bind_base . "conf-master/"; my $bind_conf_slave = $bind_base . "conf-slave/"; -my $tgname = $nms::config::tgname; - -my $pri_hostname = $nms::config::pri_hostname; -my $pri_v4 = $nms::config::pri_v4; -my $pri_v6 = $nms::config::pri_v6; - -my $sec_hostname = $nms::config::sec_hostname; -my $sec_v4 = $nms::config::sec_v4; -my $sec_v6 = $nms::config::sec_v6; - -my $ddns_key = $nms::config::ddns_key; - -my $ddns_to = $nms::config::ddns_to; - -my $base_ipv4 = new Net::IP( $nms::config::base_ipv4net ); +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> ) -{ +while ( <STDIN> ){ next if ( $_ =~ m/^#/); my $line = $_; chomp $line; - die ("Invalid format on input") if not $line =~ m/^(\d+)\.(\d+)\.(\d+)\.(\d+)\s+(\d+)\s+([\w|-]+)\s*.*/; - my ( $p_oct, $s_oct, $t_oct, $f_oct, $size, $name ) = ( $1, $2, $3, $4, $5, $6 ); + # <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") 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 $dhconfig = $dhcp_dynconf_dir . $name . ".conf"; my $master_config = $bind_conf_master . $name . ".conf"; my $slave_config = $bind_conf_slave . $name . ".conf"; - my $zone_file = $bind_base . "dynamic/$name.$tgname.gathering.org.zone"; + my $zone_file = $bind_base . "dynamic/$name.$nms::config::tgname.gathering.org.zone"; + + my $v4_range = Net::IP->new( $v4_net ) or die ("v4_net fail"); + my $v6_range = Net::IP->new( $v6_net ) or die ("v6_net fail"); + + # 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 $numhosts = $range->size(); + my $mask = $range->mask(); + my $router = $net_base . "." . ($f_oct+1); + my $first = $net_base . "." . ( $f_oct + 5 ); + + my $last = $first; + if ( $size < 24 ) + { + # Net::IP iteration is crazyslow. So, we stopped using iterations. + my $last_ip = $range->last_ip(); + $last_ip =~ m/(\d+)\.(\d+)\.(\d+)\.(\d+)/; + $last = sprintf("%d.%d.%d.%d", $1, $2, $3, $4-2); + } + else { $last = $net_base . "." . ( $f_oct + $numhosts - 2 ); } + + #print STDERR "Name : " . $name . "\n"; + #print STDERR "Net : " . $net . "\n"; + #print STDERR "Mask : " . $mask . "\n"; + #print STDERR "Router : " . $router . "\n"; + #print STDERR "Size : " . $size . "\n"; + #print STDERR "Numhosts : " . $numhosts . "\n"; + #print STDERR "First : " . $first . "\n"; + #print STDERR "Last : " . $last . "\n"; + + open DFILE, ">" . $dhconfig or die ( $! . " " . $dhconfig); + + print DFILE "zone $name.$nms::config::tgname.gathering.org {\n"; + print DFILE " primary $nms::config::ddns_to;\n"; + print DFILE " key DHCP_UPDATER;\n"; + print DFILE "}\n\n"; + + print DFILE "subnet $net netmask $mask {\n"; + print DFILE " authoritative;\n"; + print DFILE " option routers $router;\n"; + print DFILE " option domain-name \"$name.$nms::config::tgname.gathering.org\";\n"; + print DFILE " ddns-domainname \"$name.$nms::config::tgname.gathering.org\";\n"; + print DFILE " range $first $last;\n"; + print DFILE " ignore client-updates;\n"; + print DFILE "}\n\n"; + + close DFILE; + } - my $net_base = $p_oct . "." . $s_oct . "." . $t_oct; - my $net = $net_base . "." . $f_oct; - my $range = new Net::IP( $net . "/" . $size ) or die ("oopxos"); + # DHCP6 + my $dhcp_dynconf_dir = $dhcpd_base . "conf-v6/"; + my $dhconfig = $dhcp_dynconf_dir . $name . ".conf"; - # Create configuration files for DHCP on master/primary - if ( ( not -f $dhconfig ) && ( $role eq "master" ) ) + if ( not -f $dhconfig ) { print STDERR "Creating file " . $dhconfig . "\n"; my $numhosts = $range->size(); - my $mask = $range->mask(); + my $mask = $range->mask(); my $router = $net_base . "." . ($f_oct+1); my $first = $net_base . "." . ( $f_oct + 5 ); @@ -103,16 +137,16 @@ while ( <STDIN> ) open DFILE, ">" . $dhconfig or die ( $! . " " . $dhconfig); - print DFILE "zone $name.$tgname.gathering.org {\n"; - print DFILE " primary $ddns_to;\n"; + print DFILE "zone $name.$nms::config::tgname.gathering.org {\n"; + print DFILE " primary $nms::config::ddns_to;\n"; print DFILE " key DHCP_UPDATER;\n"; print DFILE "}\n\n"; print DFILE "subnet $net netmask $mask {\n"; print DFILE " authoritative;\n"; print DFILE " option routers $router;\n"; - print DFILE " option domain-name \"$name.$tgname.gathering.org\";\n"; - print DFILE " ddns-domainname \"$name.$tgname.gathering.org\";\n"; + print DFILE " option domain-name \"$name.$nms::config::tgname.gathering.org\";\n"; + print DFILE " ddns-domainname \"$name.$nms::config::tgname.gathering.org\";\n"; print DFILE " range $first $last;\n"; print DFILE " ignore client-updates;\n"; print DFILE "}\n\n"; @@ -128,21 +162,20 @@ while ( <STDIN> ) print ZFILE << "EOF"; ; Base reverse zones are updated from dhcpd -- DO NOT TOUCH! \$TTL 3600 -@ IN SOA $pri_hostname.$tgname.gathering.org. abuse.gathering.org. ( +@ 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 $pri_hostname.$tgname.gathering.org. - IN NS $sec_hostname.$tgname.gathering.org. -\$ORIGIN $name.$tgname.gathering.org. + 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"); @@ -154,19 +187,19 @@ EOF print STDERR "Creating file " . $bind_file . "\n"; open NFILE, ">" . $bind_file or die ( $! . " " . $bind_file); - print NFILE "zone \"$name.$tgname.gathering.org\" {\n"; + print NFILE "zone \"$name.$nms::config::tgname.gathering.org\" {\n"; if ( $role eq "master" ) { print NFILE " type master;\n"; print NFILE " notify yes;\n"; print NFILE " allow-update { key DHCP_UPDATER; };\n"; - print NFILE " file \"dynamic/$name.$tgname.gathering.org.zone\";\n"; + print NFILE " file \"dynamic/$name.$nms::config::tgname.gathering.org.zone\";\n"; } else { print NFILE " type slave;\n"; print NFILE " notify no;\n"; print NFILE " masters { bootstrap; };\n"; - print NFILE " file \"slave/$name.$tgname.gathering.org.zone\";\n"; + print NFILE " file \"slave/$name.$nms::config::tgname.gathering.org.zone\";\n"; } print NFILE " allow-transfer { ns-xfr; };\n"; print NFILE "};\n"; |