#!/usr/bin/perl -I /root/tgmanage use strict; use Net::IP; BEGIN { require "include/config.pm"; eval { require "include/config.local.pm"; }; } my $base = "/etc"; $base = $ARGV[0] if $#ARGV > -1; $base .= "/" if not $base =~ m/\/$/ and not $base eq ""; my $dhcpd_base = $base . "dhcp/"; my $dhcpd_conf = $dhcpd_base . "dhcpd6.conf"; my $dhcpd_pxeconf = $dhcpd_base . "v6-pxe-boot.conf"; my $dhcpd_wlc_conf = $dhcpd_base . "v6-wlc.conf"; my $dhcpd_voip_conf = $dhcpd_base . "v6-voip.conf"; my $sec_net = Net::IP->new($nms::config::sec_net_v6)->short(); my ($sec_first, $sec_last) = ("8000", "9999"); # Create PXE-boot configuration file for DHCP if ( not -f $dhcpd_conf ) { print STDERR "Creating file " . $dhcpd_conf . "\n"; open DHCPDFILE, ">" . $dhcpd_conf or die ( $! . " " . $dhcpd_conf); print DHCPDFILE <<"EOF"; # GENERATED BY make-dhcpd6.pl # IPv6 address valid lifetime # (at the end the address is no longer usable by the client) # (usual IPv6 default is 30 days) default-lease-time 3600; # IPv6 address preferred lifetime # (at the end the address is deprecated, i.e., the client should use # other addresses for new connections) # (usual IPv6 default is 7 days) preferred-lifetime 3600; # T1, the delay before Renew # (default is 1/2 preferred lifetime) option dhcp-renewal-time 1800; # T2, the delay before Rebind (if Renews failed) # (default is 3/4 preferred lifetime) option dhcp-rebinding-time 1800; # Enable RFC 5007 support allow leasequery; # Set preference to 255 (maximum) in order to avoid waiting for # additional servers when there is only one option dhcp6.preference 255; # Server side command to enable rapid-commit (2 packet exchange) option dhcp6.rapid-commit; # The delay before information-request refresh # (minimum is 10 minutes, maximum one day, default is to not refresh) # (set to 6 hours) option dhcp6.info-refresh-time 21600; # Don't let clients set their own FQDN ignore client-updates; # disable ddns ddns-update-style none; # make server authorative authoritative; # Global definitions for name server address(es) and domain search list option domain-name "$nms::config::tgname.gathering.org"; option dhcp6.name-servers $nms::config::pri_v6, $nms::config::sec_v6; key DHCP_UPDATER { algorithm HMAC-MD5.SIG-ALG.REG.INT; secret $nms::config::ddns_key; } subnet6 $nms::config::pri_net_v6 {} subnet6 $nms::config::sec_net_v6 { range6 ${sec_net}${sec_first} ${sec_net}${sec_last}; } include "/etc/dhcp/v6-generated-include.conf"; include "$dhcpd_pxeconf"; #include "$dhcpd_wlc_conf"; #include "$dhcpd_voip_conf"; EOF close DHCPDFILE; } # Create PXE-boot configuration file for DHCP if ( not -f $dhcpd_pxeconf ) { print STDERR "Creating file " . $dhcpd_pxeconf . "\n"; open PXEFILE, ">" . $dhcpd_pxeconf or die ( $! . " " . $dhcpd_pxeconf); print PXEFILE <<"EOF"; option dhcp6.bootfile-url code 59 = string; option dhcp6.client-arch-type code 61 = array of unsigned integer 16; if option dhcp6.client-arch-type = 00:07 { option dhcp6.bootfile-url "tftp://[$nms::config::pxe_server_v6]/bootx64.efi"; } else { # support a hypothetical BIOS system that can PXE boot over IPv6 option dhcp6.bootfile-url "tftp://[$nms::config::pxe_server_v6]/pxelinux.0"; } EOF close PXEFILE; } # Create WLC configuration file if ( not -f $dhcpd_wlc_conf ) { print STDERR "Creating file " . $dhcpd_wlc_conf . "\n"; open WLCFILE, ">" . $dhcpd_wlc_conf or die ( $! . " " . $dhcpd_wlc_conf); print WLCFILE <<"EOF"; option space AP; option AP.server-address code 241 = array of ip-address; set vendor-string = option vendor-class-identifier; class "access-points" { match if substring (option vendor-class-identifier, 0, 8) = "Access Point"; vendor-option-space AP; option AP.server-address $nms::config::wlc1_v6; } EOF close WLCFILE; } # Create VoIP config if ( not -f $dhcpd_voip_conf ) { print STDERR "Creating file " . $dhcpd_voip_conf . "\n"; open VOIPFILE, ">" . $dhcpd_voip_conf or die ( $! . " " . $dhcpd_voip_conf); print VOIPFILE <<"EOF"; option space CiscoVOIP; option CiscoVOIP.cm-tftp-server code 150 = array of ip-address; class "cisco-voip-lan" { match if substring (option vendor-class-identifier, 0, 28) = "Cisco Systems, Inc. IP Phone"; vendor-option-space CiscoVOIP; log( info, concat( "LOLOPHONE: " , option vendor-class-identifier )); option CiscoVOIP.cm-tftp-server $nms::config::voip1_v6; next-server $nms::config::voip1_v6; } class "cisco-voip-wlan" { match if substring (option vendor-class-identifier, 0, 33) = "Cisco Systems Inc. Wireless Phone"; vendor-option-space CiscoVOIP; log( info, concat( "BANANAPHONE: " , option vendor-class-identifier )); option CiscoVOIP.cm-tftp-server $nms::config::voip1_v6; next-server $nms::config::voip1_v6; } EOF close VOIPFILE; }