#!/usr/bin/perl5 require "/usr/OnRamp/lib/OnRamp.pm"; $conf = "/etc/named.boot"; $dummy = "/etc/named.boot.dummy"; $myname = "named-config.cgi"; $title = "Domain Name Server"; print "Content-type: text/html\n\n"; &title_block($title); &get_fields; `/etc/chkconfig named`; $status = $? >> 8; if ($status) { $srv_on = 'No'; } else { $srv_on = 'Yes'; } $edit = 0; $delete = 0; &getDomains; if (%fld) { $fld{'chosen'} =~ /([\w.]+)/; $fld{'chosen'} = $1; $help = $ENV{"DOCUMENT_ROOT"} . $ENV{"SCRIPT_NAME"}; $help =~ s/cgi$/hlp/; exec $help if ($fld{'help'} eq "Help"); if ($fld{'doit'} eq 'Ok') { if ($srv_on ne $fld{'server'}) { &changeStatus; } if ($fld{'delFile'}) { &delete($fld{'delFile'}); } &ckeckForwarders; &checkSlave; if (!$message) { if (!$fld{'newDomain'}) { $message = "No changes made."; } else { $message = qq|To add a new domain, click the "Add New Domain" button.|; } } } elsif ($fld{'add'}) { &formValid_add; $val{'domain'} = $fld{'newDomain'}; $val{'type'} = $type; &getAdd; } elsif ($fld{'delete'}) { &error(0,"No domain selected.") if !$fld{'chosen'}; $message = qq|Click "Ok" to save changes.|; $delete = 1; } elsif ($fld{'doAdd'} eq 'Ok') { &formValid_doAdd; &addDomain; &getDomains; } elsif ($fld{'doEdit'} eq 'Ok') { &formValid_doEdit; &editDomain; &getDomains; } elsif ($fld{'edit'}) { &error(0,"No domain selected.") if !$fld{'chosen'}; &getDomains($fld{'chosen'}); &putEdit; &getEdit; $edit = 1; } } if (($fld{'add'} ne 'Add New Domain') && ($edit == 0)) { if (-e "/usr/sbin/named") { &generic; } else { &header_block($title); print "The domain name server software is not installed on this machine. Install subsystem eoe.sw.named from the 6.2 CD."; } } sub checkSlave { if ($val{'slave'} ne $fld{'slave'}) { if ($fld{'slave'} eq 'Yes') { open(OUT,">> $conf"); print OUT "slave\n"; close(OUT); $val{'slave'} = 'Yes'; $message = "Dynamic creation of direct links disabled."; } else { open(IN,"< $conf"); open(OUT,"> $dummy"); while() { @items = split(/\s+/); if ($items[0] ne 'slave') { print OUT $_; } } close(IN); close(OUT); rename($dummy,$conf); $val{'slave'} = 'No'; $message = "Dynamic creation of direct links enabled."; } } } sub changeStatus { if($fld{'server'} eq 'Yes') { `/etc/chkconfig named on`; `/usr/sbin/named.restart`; $srv_on = "Yes"; $message = "Name server enabled."; } else { `/etc/chkconfig named off`; `/etc/killall named`; $srv_on = "No"; $message = "Name server disabled."; } } sub formValid_add { &error(0,"Cannot add duplicate domain name.") if grep($_ eq $fld{'newDomain'},@domainList); if (! ( $fld{'newDomain'} =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)\.in-addr\.arpa/ )) { &error(0,"Invalid domain name.") if &check_hostname($fld{'newDomain'}); } else { $reverse = "$4.$3.$2.$1"; &error(0,"Invalid IP address: $reverse.") if &check_ipaddr($reverse); } } sub formValid_doAdd { my $erval = &check_fname($fld{'newFile'}); &error(1,$erval) if $erval; if ($fld{'newType'} eq 'secondary') { &error(1,"Server addresses required for secondary domain.") if !$fld{'list'}; @list = split(/[\n\s]+/,$fld{'list'}); foreach $arg (@list) { &error(1,"Invalid IP address: $arg.") if &check_ipaddr($arg); } } } sub formValid_doEdit { my $erval = &check_fname($fld{'newFile'}); &error(2,$erval) if $erval; if ($fld{'type'} eq 'secondary') { &error(2,"Server addresses required for secondary domain.") if !$fld{'list'}; @list = split(/[\n\s]+/,$fld{'list'}); foreach $arg (@list) { &error(2,"Invalid IP address: $arg.") if &check_ipaddr($arg); } } } sub error { $mes = $_[1]; $send = $_[0]; &error_block($mes); %val = %fld; if ($send == 0) { &generic; } elsif ($send == 1) { &getAdd; } elsif ($send == 2) { &getEdit; } exit 0; } sub editDomain { open(IN,"< $conf"); open(OUT,"> $dummy"); while() { $line = $_; @items = split(/\s+/,$line); if ($items[1] ne $fld{'chosen'}) { print OUT $line; next; } else { print OUT "# $line"; } } $numTab1 = 2 - length($fld{'type'})/8; $numTab2 = 4 - length($fld{'domain'})/8; print OUT $fld{'type'}; for ($i=0;$i<$numTab1;$i++) { print OUT "\t"; } print OUT $fld{'chosen'}; if ($fld{'type'} eq 'primary') { for ($i=0;$i<$numTab2;$i++) { print OUT "\t"; } } else { print OUT " "; foreach $arg (@list) { print OUT "$arg "; } } print OUT "$fld{'newFile'}\n"; close(IN); close(OUT); rename($dummy, $conf); $message = "Domain edited."; } sub putEdit { $val{'newFile'} = $file; $val{'list'} = ""; foreach $arg (@listServe) { $val{'list'} .= "$arg\n"; } } sub getEdit { $num = $_[0]; &header_block("Edit Domain"); print "
"; print ""; print ""; print ""; print ""; print "\n"; if ($fld{'type'.$num} ne 'primary') { print ""; print ""; print "\n"; } print "
Domain name:$fld{'chosen'}
Name server type:$val{'type'}
File name for domain information:"; print &text("newFile",$val{'newFile'},21); print "
List of server addresses:

"; print "  Note: server address list required only for secondary domains.

"; print &buttons("doEdit","Ok"); print "
"; } sub delete { $num = $_[0]; open(IN,"< $conf"); open(OUT,"> $dummy"); while() { @items = split(/\s+/); if ($items[1] eq $_[0]) { print OUT "# $_"; } else { print OUT $_; } } close(IN); close(OUT); rename($dummy, $conf); $message = "Domain deleted."; } sub addDomain { $numTab1 = 2 - length($fld{'newType'})/8; $numTab2 = 4 - length($fld{'domain'})/8; open(OUT,">> $conf"); print OUT $fld{'newType'}; for ($i=0;$i<$numTab1;$i++) { print OUT "\t"; } print OUT $fld{'domain'}; if ($fld{'newType'} eq 'primary') { for ($i=0;$i<$numTab2;$i++) { print OUT "\t"; } } else { print OUT " "; foreach $arg (@list) { print OUT "$arg "; } } print OUT "$fld{'newFile'}\n"; close(OUT); $message = "$fld{'domain'} domain added."; } sub turnOn { `/etc/chkconfig named on`; $srv_on = 'Yes'; $message = "Named enabled"; } sub turnOff { `/etc/chkconfig named off`; $srv_on = 'No'; $message = "Named disabled"; } sub getDomains { $getDomain = $_[0]; undef @domainList; undef @listServe; undef @forwarders, $forwarders; $val{'slave'} = "No"; open(IN,"< $conf"); $i = 0; while() { $line = $_; @items = split(/\s+/,$line); $domain = $items[1]; if ($items[0] eq 'slave') { $val{'slave'} = "Yes"; } elsif ($items[0] eq 'forwarders') { for ($i=1;$i<=$#items;$i++) { push(@forwarders,$items[$i]); } } elsif ($items[0] eq 'primary' || $items[0] eq 'secondary') { push(@domainList,$domain); if ($getDomain eq $domain) { $val{'type'} = $items[0]; $file = $items[$#items]; if ($val{'type'} eq 'secondary') { for ($i=2;$i<$#items;$i++) { push(@listServe,$items[$i]); } } } } else { next; } # cache not supported yet } close(IN); $val{'forwarders'} = join("\n",@forwarders); } sub ckeckForwarders { &getDomains; @list = split(/[\n\s]+/,$fld{'forwarders'}); $newForwarders = join("\n",@list); if ($newForwarders ne $val{'forwarders'}) { open(IN,"< $conf"); open(OUT,"> $dummy"); while() { @items = split(/\s+/); if ($items[0] ne 'forwarders') { print OUT $_; } else { print OUT "# $_"; } } if (@list) { print OUT "forwarders\t@list\n"; } close(IN); close(OUT); rename($dummy, $conf); $val{'forwarders'} = join("\n",@list); $message = "List of other servers that can resolve names edited."; } } sub getAdd { &header_block("Add New Domain"); if (!$val{'newFile'}) { $val{'newFile'} = "/etc/named.d/db.".$val{'domain'}; } print "
"; print qq||; print ""; print ""; print ""; print ""; print "\n"; print ""; print ""; print "\n"; print "
Domain name:$val{'domain'}
Name server type:", &select('newType',$val{'newType'},'primary','secondary'), "
File name for domain information:", &text("newFile",$val{'newFile'},21), "
List of server addresses:

"; print "  Note: server address list required only for secondary domains.

"; print &buttons("doAdd","Ok"); print "
"; } sub generic { &header_block($title); $val{'newDomain'} = $fld{'newDomain'}; print "$message"; print "
"; if ($delete) { print ""; } print "
"; print ""; print "
Enable DNS server:"; print &radio('server',$srv_on,'Yes','No'); print "
"; print ""; print qq||; print qq||; if ($delete) { undef @locList; foreach $arg (@domainList) { if ($fld{'chosen'} ne $arg) { push(@locList,$arg); } } } else { @locList = @domainList; } print qq||; print qq||; print qq||; print ""; print ""; print ""; print "
|,&text("newDomain",$val{'newDomain'},19),qq|
|, &choice_list(*locList,"chosen",20), qq|
 
Other servers to contact if name cannot be resolved:"; print "
Limit contact hosts to above:"; print &radio('slave',$val{'slave'},'Yes','No'); print "
"; print "
", &buttons('doit','Ok'); print "
"; }