#!/usr/bin/perl ########################################################################### # # PERL program to create a zone file for named. # # Copyright © 2000, Dayton Jones . # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # Description: # # # # Usage: # # zone [--help ] # # Options: # (short options work as well [-h or --help]) # # --help Display this help message and exit. # # # Revisions: # # 08/07/2000 File created by new_perl v.1.0.0 # ########################################################################### ########################################################################### # Constants ########################################################################### use File::Basename; use Getopt::Long; $PROGNAME=basename($0); $VERSION="0.0.1"; $USER=getpwuid($<); $ID=`id -u`; chop(($env,$home)=split(/\=/,`env |grep HOME`)); ########################################################################### # Subprocedures ########################################################################### sub clean_up { ##### # Function to remove temporary files and other housekeeping # No arguments ##### `rm -f $TEMP_FILE`; } sub error_exit { ##### # Function for exit due to fatal program error # Accepts 1 argument # string containing descriptive error message ##### print "$PROGNAME: $1:-Unknown Error \n"; clean_up; exit 1; } sub make_temp_files { ##### # Function to create temporary files # No arguments ##### # Use user's local tmp directory if it exists if ( -d "$home/tmp" ) { $TEMP_DIR="$home/tmp"; } else { $TEMP_DIR="/tmp"; } $TEMP_FILE="$TEMP_DIR/$PROGNAME.$$"; open(TEMP,">$TEMP_FILE"); } sub graceful_exit { ##### # Function called for a graceful exit # No arguments ##### clean_up; exit; } sub term_exit { ##### # Function to perform exit if termination signal is trapped # No arguments ##### print "$PROGNAME: Terminated\n"; clean_up; exit; } sub int_exit { ##### # Function to perform exit if interrupt signal is trapped # No arguments ##### print "$PROGNAME: Aborted by user\n"; clean_up; exit; } sub usage { ##### # Function to display usage message (does not exit) # No arguments ##### print "\tUsage: $PROGNAME [--help] \n"; } sub helptext { ##### # Function to display help message for program # No arguments ##### print < "; chop($domain=); print "Enter the first 3 octects of the address space ----> "; chop($ip=); print "Enter the CIDR block (24,27,etc - /24-/29 only) ---> /"; chop($cidr=); if ($cidr gt "29" || $cidr lt "24") { print "This script will only create zones for /24 to /29 subnets\n"; sleep 5; system("clear"); &get_info; exit; } print "Enter primary nameserver for zone -----------------> "; chop($ns1=); print "Enter secondary nameserver for zone ---------------> "; chop($ns2=); chop($date=`/bin/date +%Y%m%d%H`); } sub subnet { if ($cidr == 29) { system("clear"); print " Which subnet (1-32):\n"; print " Network# IP-Range Broadcast\n"; print " ==================================\n"; print " 1) .0 .1-.6 .7\n"; print " 2) .8 .9-.14 .15\n"; print " 3) .16 .17-.22 .23\n"; print " 4) .24 .25-.30 .31\n"; print " 5) .32 .33-.38 .39\n"; print " 6) .40 .41-.46 .47\n"; print " 7) .48 .49-.54 .55\n"; print " 8) .56 .57-.62 .63\n"; print " 9) .64 .65-.70 .71\n"; print " 10) .72 .73-.78 .79\n"; print " 11) .80 .81-.86 .87\n"; print " 12) .88 .89-.94 .95\n"; print " 13) .96 .97-.102 .103\n"; print " 14) .104 .105-.110 .111\n"; print " 15) .112 .113-.118 .119\n"; print " 16) .120 .121-.126 .127\n"; print " 17) .128 .129-.134 .135\n"; print " 18) .136 .137-.142 .143\n"; print " 19) .144 .145-.150 .151\n"; print " 20) .152 .153-.158 .159\n"; print " 21) .160 .161-.166 .167\n"; print " 22) .168 .169-.174 .175\n"; print " 23) .176 .177-.182 .183\n"; print " 24) .184 .185-.190 .191\n"; print " 25) .192 .193-.198 .199\n"; print " 26) .200 .201-.206 .207\n"; print " 27) .208 .209-.214 .215\n"; print " 28) .216 .217-.222 .223\n"; print " 29) .224 .225-.230 .231\n"; print " 30) .232 .233-.238 .239\n"; print " 31) .240 .241-.246 .247\n"; print " 32) .248 .249-.254 .255\n"; print "\n"; chop($nn=); if ($nn==1){ $start = "1"; $end = "6"; } if ($nn==2){ $start = "9"; $end = "14"; } if ($nn==3){ $start = "17"; $end = "22"; } if ($nn==4){ $start = "25"; $end = "30"; } if ($nn==5){ $start = "33"; $end = "38"; } if ($nn==6){ $start = "41"; $end = "46"; } if ($nn==7){ $start = "49"; $end = "54"; } if ($nn==8){ $start = "57"; $end = "62"; } if ($nn==9){ $start = "65"; $end = "70"; } if ($nn==10){ $start = "73"; $end = "78"; } if ($nn==11){ $start = "81"; $end = "86"; } if ($nn==12){ $start = "89"; $end = "94"; } if ($nn==13){ $start = "97"; $end = "102"; } if ($nn==14){ $start = "105"; $end = "110"; } if ($nn==15){ $start = "113"; $end = "118"; } if ($nn==16){ $start = "121"; $end = "126"; } if ($nn==17){ $start = "129"; $end = "134"; } if ($nn==18){ $start = "137"; $end = "142"; } if ($nn==19){ $start = "145"; $end = "150"; } if ($nn==20){ $start = "153"; $end = "158"; } if ($nn==21){ $start = "161"; $end = "166"; } if ($nn==22){ $start = "169"; $end = "174"; } if ($nn==23){ $start = "177"; $end = "182"; } if ($nn==24){ $start = "185"; $end = "190"; } if ($nn==25){ $start = "193"; $end = "198"; } if ($nn==26){ $start = "201"; $end = "206"; } if ($nn==27){ $start = "209"; $end = "214"; } if ($nn==28){ $start = "217"; $end = "222"; } if ($nn==29){ $start = "225"; $end = "230"; } if ($nn==30){ $start = "233"; $end = "238"; } if ($nn==31){ $start = "241"; $end = "246"; } if ($nn==32){ $start = "249"; $end = "254"; } } if ($cidr==28){ system("clear"); print " Which subnet (1-16):\n"; print " Network# IP-Range Broadcast\n"; print " ==================================\n"; print " 1) .0 .1-.14 .15\n"; print " 2) .16 .17-.30 .31\n"; print " 3) .32 .33-.46 .47\n"; print " 4) .48 .49-.62 .63\n"; print " 5) .64 .65-.78 .79\n"; print " 6) .80 .81-.94 .95\n"; print " 7) .96 .97-.110 .111\n"; print " 8) .112 .113-.126 .127\n"; print " 9) .128 .129-.142 .143\n"; print " 10) .144 .145-.158 .159\n"; print " 11) .160 .161-.174 .175\n"; print " 12) .176 .177-.190 .191\n"; print " 13) .192 .193-.206 .207\n"; print " 14) .208 .209-.222 .223\n"; print " 15) .224 .225-.238 .239\n"; print " 16) .240 .241-.254 .255\n"; print "\n"; chop($nn = ); if ($nn==1){ $start = "1"; $end = "14"; } if ($nn==2){ $start = "17"; $end = "30"; } if ($nn==3){ $start = "33"; $end = "46"; } if ($nn==4){ $start = "49"; $end = "62"; } if ($nn==5){ $start = "65"; $end = "78"; } if ($nn==6){ $start = "81"; $end = "94"; } if ($nn==7){ $start = "97"; $end = "110"; } if ($nn==8){ $start = "113"; $end = "126"; } if ($nn==9){ $start = "129"; $end = "142"; } if ($nn==10){ $start = "145"; $end = "158"; } if ($nn==11){ $start = "161"; $end = "174"; } if ($nn==12){ $start = "177"; $end = "190"; } if ($nn==13){ $start = "193"; $end = "206"; } if ($nn==14){ $start = "209"; $end = "222"; } if ($nn==15){ $start = "225"; $end = "238"; } if ($nn==16){ $start = "241"; $end = "254"; } } if ($cidr==27){ system("clear"); print " Which subnet (1-8):\n"; print " Network# IP-Range Broadcast\n"; print " ==================================\n"; print " 1) .0 .1-.30 .31\n"; print " 2) .32 .33-.62 .63\n"; print " 3) .64 .65-.94 .95\n"; print " 4) .96 .97-.126 .127\n"; print " 5) .128 .129-.158 .159\n"; print " 6) .160 .161-.190 .191\n"; print " 7) .192 .193-.222 .223\n"; print " 8) .224 .225-.254 .255\n"; print "\n"; chop($nn = ); if ($nn==1){ $start = "1"; $end = "30"; } if ($nn==2){ $start = "33"; $end = "62"; } if ($nn==3){ $start = "65"; $end = "94"; } if ($nn==4){ $start = "97"; $end = "126"; } if ($nn==5){ $start = "129"; $end = "158"; } if ($nn==6){ $start = "161"; $end = "190"; } if ($nn==7){ $start = "193"; $end = "222"; } if ($nn==8){ $start = "225"; $end = "254"; } } if ($cidr==26){ system("clear"); print " Which subnet (1-4):\n"; print " Network# IP-Range Broadcast\n"; print " ==================================\n"; print " 1) .0 .1-.62 .63\n"; print " 2) .64 .65-.126 .127\n"; print " 3) .128 .129-.190 .191\n"; print " 4) .192 .193-.254 .255\n"; print "\n"; chop($nn = ); if ($nn==1){ $start = "1"; $end = "62"; } if ($nn==2){ $start = "65"; $end = "126"; } if ($nn==3){ $start = "129"; $end = "190"; } if ($nn==4){ $start = "193"; $end = "254"; } } if ($cidr==25){ system("clear"); print " Which subnet (1-2):\n"; print " Network# IP-Range Broadcast\n"; print " ==================================\n"; print " 1) .0 .1-.126 .127\n"; print " 2) .128 .129-.254 .255\n"; print "\n"; chop($nn = ); if ($nn==1){ $start = "1"; $end = "126"; } if ($nn==2){ $start = "129"; $end = "254"; } } if ($cidr==24){ $start = "1"; $end = "254"; } } sub zone { ($oct1,$oct2,$oct3)=split(/\./,$ip); open(ZONE, ">db.$domain"); open(ADDR, ">db.$domain.rev"); system("clear"); print "\nSaved to db.$domain and reverse saved to db.$domain.rev\n"; print ZONE "\@ IN SOA $ns1. hostmaster.$domain. \(\n\n"; print ZONE " $date\t; serial number\n"; print ZONE " 10800\t\t; refresh (3 hours)\n"; print ZONE " 1800\t\t; retry (30 minutes)\n"; print ZONE " 864000\t\t; expire (1 week 3 days)\n"; print ZONE " 43200\t\t; cache (12 hours)\n\n"; print ZONE " \)\n"; print ZONE "\@ IN NS $ns1.\n"; print ZONE "\@ IN NS $ns2.\n\n"; print ZONE "\$ORIGIN $domain.\n"; print ZONE " IN MX 1 mail.$domain.\n"; print ZONE "\n\n"; print ZONE "www IN CNAME host$start.$domain.\n"; print ZONE "ftp IN CNAME host$start.$domain.\n"; print ZONE "mail IN CNAME host$start.$domain.\n\n"; for $entry ($start..$end) { print ZONE "host$entry IN A $ip.$entry\n"}; print ADDR "\@ IN SOA $ns1. hostmaster.$domain. \(\n\n"; print ADDR " $date\t; serial number\n"; print ADDR " 10800\t\t; refresh (3 hours)\n"; print ADDR " 1800\t\t; retry (30 minutes)\n"; print ADDR " 864000\t\t; expire (1 week 3 days)\n"; print ADDR " 43200\t\t; cache (12 hours)\n\n"; print ADDR " \)\n"; print ADDR "\@ IN NS $ns1.\n"; print ADDR "\@ IN NS $ns2.\n\n"; print ADDR "\$ORIGIN $oct3.$oct2.$oct1.in-addr.arpa.\n"; for $entry ($start..$end) { print ADDR "$entry IN PTR host$entry.$domain.\n"}; close(ZONE); close(ADDR); } ########################################################################### # Program starts here ########################################################################### ##### Initialization And Setup ##### # Set file creation mask so that all files are created with 600 permissions. root_check; # Trap TERM, HUP, and INT signals and properly exit $SIG {"TERM"} = \&term_exit; $SIG {"HUP"} = \&term_exit; $SIG {"INT"} = \&int_exit; # Create temporary file(s) make_temp_files; ##### Command Line Processing ##### GetOptions(\%args, 'help'); ##### Main Logic ##### if (exists $args{'help'}) { &helptext(); } &get_info; &subnet; &zone; # this should be the last line of the program graceful_exit;