#!/usr/bin/perl -I /root/tgmanage use strict; use Net::IP; use NetAddr::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 . "dhcpd.conf"; my $dhcpd_pxeconf = $dhcpd_base . "v4-pxe-boot.conf"; my $dhcpd_wlc_conf = $dhcpd_base . "v4-wlc.conf"; my $dhcpd_voip_conf = $dhcpd_base . "v4-voip.conf"; # primary my $pri_range = Net::IP->new($nms::config::pri_net_v4) or die ("pri_range fail"); my $pri_mask = $pri_range->mask(); my $pri_net = $pri_range->ip(); # secondary my $sec_range = Net::IP->new($nms::config::sec_net_v4) or die ("sec_range fail"); my $sec_mask = $sec_range->mask(); my $sec_net = $sec_range->ip(); (my $sec_last = NetAddr::IP->new($nms::config::sec_net_v4)->last()) =~ s/\/[0-9]{1,2}//; (my $sec_gw = NetAddr::IP->new($nms::config::sec_net_v4)->first()) =~ s/\/[0-9]{1,2}//; my $sec_num = NetAddr::IP->new($nms::config::sec_net_v4)->num(); my $sec_n = $sec_num - int($sec_num / 4); # don't use more than 1/4 of the net for DHCP (my $sec_first = NetAddr::IP->new($nms::config::sec_net_v4)->nth($sec_n)) =~ s/\/[0-9]{1,2}//; # Create main 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-dhcpd.pl # 60 min leasetime, 120 min max default-lease-time 3600; max-lease-time 7200; # make server authorative authoritative; # Don't let clients set their own FQDN ignore client-updates; # enable DDNS ddns-update-style interim; # set ddns-hostname if exists host-name { ddns-hostname = lcase(option host-name); } elsif exists fqdn.hostname { ddns-hostname = lcase(option fqdn.hostname); } else { ddns-hostname = binary-to-ascii(10, 8, "-", leased-address); } # Domain name (unless overriden elsewhere) option domain-name "$nms::config::tgname.gathering.org"; option domain-name-servers $nms::config::pri_v4, $nms::config::sec_v4; key DHCP_UPDATER { algorithm HMAC-MD5.SIG-ALG.REG.INT; secret $nms::config::ddns_key; } # Servernetwork, Tele subnet $pri_net netmask $pri_mask {} # Servernetwork, NOC # Add small range at the end for PXE subnet $sec_net netmask $sec_mask { option subnet-mask $sec_mask; option routers $sec_gw; # No DDNS ddns-updates off; ddns-hostname = none; ddns-domainname = none; # supershort leasetime default-lease-time 300; max-lease-time 600; range $sec_first $sec_last; } include "/etc/dhcp/v4-revzones.conf"; include "/etc/dhcp/v4-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 arch code 93 = unsigned integer 16; if option arch = 00:07 { filename "bootx64.efi"; } else { filename "pxelinux.0"; } next-server $nms::config::pxe_server_v4; 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 WLC; option WLC.controller-address code 43 = text; set vendor-string = option vendor-class-identifier; class "access-points" { # Number of characters has to match the substring # I.e if "Access Point", you have to use (0, 12) match if substring (option vendor-class-identifier, 0, 12) = "Access Point"; vendor-option-space WLC; option WLC.controller-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; }