Files
webmin/dnsadmin/create_slave.cgi
2007-04-12 20:24:50 +00:00

72 lines
2.0 KiB
Perl
Executable File

#!/usr/local/bin/perl
# create_slave.cgi
# Create a new slave zone
require './dns-lib.pl';
&ReadParse();
$whatfailed = "Failed to create slave zone";
%access = &get_module_acl();
$access{'slave'} || &error("You are not allowed to create slave zones");
# validate inputs
if ($in{'rev'}) {
$in{'zone'} =~ /^[\d\.]+$/ ||
&error("'$in{'zone'}' is not a valid network");
$in{'zone'} = &ip_to_arpa($in{'zone'});
}
else {
$in{'zone'} =~ /^[A-z0-9\-\.]+$/ ||
&error("'$in{'zone'}' is not a valid domain name");
}
$in{'zone'} =~ s/\.$//g;
@masters = split(/\s+/, $in{'masters'});
foreach $m (@masters) {
&check_ipaddress($m) ||
&error("'$m' is not a valid master server address");
}
if (!@masters) {
&error("You must enter at least one master server");
}
$base = $access{'dir'} eq '/' ? &base_directory($conf) : $access{'dir'};
if ($in{'file_def'} == 0) {
$in{'file'} =~ /^\S+$/ ||
&error("'$in{'file'}' is not a valid filename");
if ($in{'file'} !~ /^\//) {
$file = $base."/".$in{'file'};
}
else { $file = $in{'file'}; }
&allowed_zone_file(\%access, $file) ||
&error("'$file' is not an allowable zone file");
if (!-r $file) {
&lock_file($file);
open(ZONE, "> $file") ||
&error("Failed to create '$file' : $?");
close(ZONE);
&unlock_file($file);
}
}
elsif ($in{'file_def'} == 2) {
if ($in{'rev'}) {
$file = $base."/".&arpa_to_ip($in{'zone'}).".rev";
}
else {
$file = $base."/".$in{'zone'}.".hosts";
}
}
@vals = ($in{'zone'}, @masters);
if ($file) { push(@vals, $file); }
&lock_file($config{'named_boot_file'});
&create_zone({ 'name' => 'secondary', 'values' => \@vals });
&unlock_file($config{'named_boot_file'});
&webmin_log("create", "slave", $in{'zone'}, \%in);
# Add the new zone to the access list
if ($access{'zones'} ne '*') {
$access{'zones'} .= " ".$in{'zone'};
&save_module_acl(\%access);
}
&redirect("");