File: //scripts.20110531.215904.25158/fixndc.new
#!/usr/bin/perl
# cpanel4 - scripts Copyright(c) 1997-2002 DarkORB Communications Inc.
# All rights Reserved.
# nick@darkorb.net http://cpanel.net
# This code is subject to the cpanel license. Unauthorized copying is prohibited
die "This script is for bind 9 only" if (! -e "/etc/rndc.conf");
$resbind = 0;
$confwp = 0;
$keyname = 'key';
#system("chown","-R","named:named","/var/named");
open(RNDC,"/etc/rndc.conf");
while(<RNDC>) {
if (/secret\s+\"([^\"]+)\"/) {
$secret = $1;
}
if (/^key \"(\S+)\"/) {
$keyname = $1;
$inkey = 1;
}
if (/default-key\s*\"(\S+)\"/) {
$defaultkey = $1;
}
if($inkey) {
$key = $key . $_;
if (/}/) {
$inkey = 0;
}
}
}
close(RNDC);
#key is in $key
$needkey = 1;
$needcon = 1;
if ($keyname eq "rndckey" && $defaultkey eq "key") {
system("/scripts/fixrh72ndckey");
}
open(NDC,"/etc/named.conf");
while(<NDC>) {
if (/bind\.conf\.wp/) {
$confwp = 1;
}
if (/^key/) { print "Found key in named.conf .. \n"; $needkey=0; }
if (/^include/ && /key/) { print "Found key in (include) named.conf .. \n"; $needkey=0; }
if (/^controls/) { print "Found controls in named.conf .. \n";
$needcon=0; }
if (/secret\s+\"([^\"]+)\"/) {
if ($secret ne $1) {
$needkey = 1;
$delkey = 1;
}
}
if (/^key\s+\"([^\"]+)\"/) {
if ($keyname ne $1) {
$needkey = 1;
$delkey = 1;
$needcon = 1;
$delcon = 1;
}
}
# if (/^zone/) {last;}
}
close(NDC);
if (! -e "/var/named/named.ca") {
system("cp -f /scripts/named.ca /var/named/named.ca");
$resbind=1;
}
open(NC,">/etc/rndc.key");
close(NC);
if($keyname eq "") { $keyname = 'key'; }
if (!($needkey || $needcon || $confwp)) {
print "named.conf has already been fixed!\n";
if ($resbind) {
print "Restarting bind.....";
system("/etc/rc.d/init.d/named stop");
system("/etc/rc.d/init.d/named start");
print "Done\n";
}
exit;
}
open(NDF,">/etc/named.conf.fixndc");
if ($needkey) {
print "Adding key...\n";
print NDF "$key\n\n";
}
if ($needcon) {
print "Adding controls...\n";
print NDF <<EOM;
controls {
inet 127.0.0.1 allow { localhost; } keys { "${keyname}"; };
};
EOM
}
open(NDC,"/etc/named.conf");
$inc = 0;
while(<NDC>) {
next if /bind.conf.wp/;
if ($delcon || $delkey) {
if ( (/^controls/ && $delcon) ||
(/^key/ && $delkey) ) {
$numbrace = 0;
$numbrace += countchar($_,"{");
$numbrace -= countchar($_,"}");
$inc = 1;
$firstline = 1;
}
if (!$inc) {
print NDF $_;
} else {
if ($firstline) {
$firstline = 0;
next;
}
$numbrace += countchar($_,"{");
$numbrace -= countchar($_,"}");
if ($numbrace == 0) {
$inc = 0;
}
}
} else {
print NDF;
}
}
close(NDC);
close(NDF);
$time = time();
system("cp -f /etc/named.conf /etc/named.conf.prefixndc.${time}");
system("cp -f /etc/named.conf.fixndc /etc/named.conf");
print "Restarting bind.....";
system("/etc/rc.d/init.d/named stop");
system("/etc/rc.d/init.d/named start");
print "Done\n";
print "All fixed\n";
sub countchar {
my($chars,$match) = @_;
my($count) = 0;
my(@CHARS) = split(//, $chars);
foreach my $char (@CHARS) {
if ($char eq $match) {
$count++;
}
}
return($count);
}