mirror of
https://github.com/webmin/webmin.git
synced 2025-08-17 19:06:28 +00:00
92 lines
2.9 KiB
Perl
Executable File
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("");
|
|
|