#!/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 . "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) 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) or die ("sec_range fail"); my $sec_mask = $sec_range->mask(); my $sec_net = $sec_range->ip(); # 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-dhcpd.pl # # Central concept: as little config in the main .conf, # include almost everything from separate files.. # # log-facility local7; option domain-name "$nms::config::tgname.gathering.org"; option domain-name-servers $nms::config::pri_v4, $nms::config::sec_v4; default-lease-time 3600; max-lease-time 7200; authoritative; ddns-update-style interim; key DHCP_UPDATER { algorithm HMAC-MD5.SIG-ALG.REG.INT; secret $nms::config::ddns_key; } subnet $pri_net netmask $pri_mask {} subnet $sec_net netmask $sec_mask {} 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 AP; option AP.server-address code 241 = array of ip-address; set vendor-string = option vendor-class-identifier; class "cisco-aps" { 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; }