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

92 lines
2.9 KiB
Perl
Executable File

#!/usr/local/bin/perl
# create_master.cgi
# Create a new master zone
require './dns-lib.pl';
&ReadParse();
$whatfailed = "Failed to create zone";
%access = &get_module_acl();
$access{'master'} || &error("You cannot create master zones");
&lock_file($config{'named_boot_file'});
$conf = &get_config();
# 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-Za-z0-9\-\.]+$/ ||
&error("'$in{'zone'}' is not a valid domain name");
$in{'zone'} !~ /^[0-9\.]+$/ ||
&error("'$in{'zone'}' must be a domain, not a network");
}
$in{'zone'} =~ s/\.$//g;
$in{'master'} =~ /^[A-Za-z0-9\-\.]+$/ ||
&error("'$in{'master'}' is not a valid master server");
if ($in{'master'} !~ /\.$/) { $in{'master'} .= "."; }
$in{'email'} =~ /^\S+\@\S+$/ ||
&error("'$in{'email'}' is not a valid email address");
$in{'email'} =~ s/\@/\./g;
if ($in{'email'} !~ /\.$/) { $in{'email'} .= "."; }
$in{'refresh'} =~ /^\S+$/ ||
&error("'$in{'refresh'}' is not a valid refresh time");
$in{'retry'} =~ /^\S+$/ ||
&error("'$in{'retry'}' is not a valid transfer retry time");
$in{'expiry'} =~ /^\S+$/ ||
&error("'$in{'expiry'}' is not a valid expiry time");
$in{'minimum'} =~ /^\S+$/ ||
&error("'$in{'minimum'}' is not a valid default TTL");
$base = $access{'dir'} eq '/' ? &base_directory($conf) : $access{'dir'};
if (!$in{'file_def'}) {
$in{'file'} =~ /^\S+$/ ||
&error("'$in{'file'}' is not a valid filename");
if ($in{'file'} !~ /^\//) {
$in{'file'} = $base."/".$in{'file'};
}
&allowed_zone_file(\%access, $in{'file'}) ||
&error("'$in{'file'}' is not an allowable zone file");
}
elsif ($in{'rev'}) {
# create filename for reverse zone
$in{'file'} = $base."/".&arpa_to_ip($in{'zone'}).".rev";
}
else {
# create filename for forward zone
$in{'file'} = $base."/$in{'zone'}.hosts";
}
&lock_file($in{'file'});
open(ZONE, ">$in{'file'}") || &error("Failed to create '$in{'file'}' : $?");
close(ZONE);
# create the SOA and NS records
if ($config{'soa_style'} == 1) {
$serial = &date_serial()."00";
}
else {
$serial = time();
}
$vals = "$in{'master'} $in{'email'} (\n".
"\t\t\t$serial\n".
"\t\t\t$in{'refresh'}\n".
"\t\t\t$in{'retry'}\n".
"\t\t\t$in{'expiry'}\n".
"\t\t\t$in{'minimum'} )";
&create_record($in{'file'}, "$in{'zone'}.", undef, "IN", "SOA", $vals);
&create_record($in{'file'}, "$in{'zone'}.", undef, "IN", "NS", $in{'master'});
&unlock_file($in{'file'});
# create the zone directive
&create_zone({ 'name' => 'primary', 'values' => [ $in{'zone'}, $in{'file'} ]});
&unlock_file($config{'named_boot_file'});
&webmin_log("create", "master", $in{'zone'}, \%in);
# Add the new zone to the access list
if ($access{'zones'} ne '*') {
$access{'zones'} .= " ".$in{'zone'};
&save_module_acl(\%access);
}
&redirect("");