#!/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;
}
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;
next-server $nms::config::voip1;
}
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;
next-server $nms::config::voip1;
}
EOF
close VOIPFILE;
}