Viewing File: /usr/local/cpanel/whostmgr/docroot/cgi/ardcluster/switchmaster.cgi
#!/usr/local/cpanel/3rdparty/bin/perl
BEGIN {
push @INC, '/root/ard/lib/';
}
use Carp ();
use LWP::Simple;
use XML::Simple;
use DNSRepl;
use lib "/usr/local/cpanel";
use DBI;
require "/root/ard/readconfig.pl";
use strict;
our $VERSION = "6.2";
BEGIN {
unshift(@INC, '/usr/local/cpanel', '/scripts');
pop(@INC) if ($INC[$#INC] eq '.');
}
my $conf_file = '/root/ard/etc/global.conf';
my $clusterpresent=0;
my ($dbh, $sth, @row);
my $user_2proceed = "";
my $Conf;
my $CleanDomains;
# get configured options
$Conf = &readconfig::ReadConfig ($conf_file);
# read input query string
my $q_action = $ENV{QUERY_STRING};
my @f_action = split('&', $q_action);
my %queryString = ();
foreach my $f_part (@f_action) {
my $name;
my $value;
($name, $value) = split(/\=/, $f_part);
$queryString{ "$name" } = $value;
}
print "content-type: text/html\n\n";
print "<style>";
print <<EOF;
.leftpadded {
padding-left: 25px;
}
.left_padded {
padding-left: 40px;
}
.number {
padding-left: 25px;
color: blue;
font-weight: green;
text-align: right;
}
.middletitle {
padding-left: 15;
font-weight: bold;
font-size: 20px;
text-decoration: underline;
}
.server {
font-weight: bold;
color: brown;
}
.final_msg_success {
font-weight: bold;
color: blue;
font-family: Georgia,Verdana;
padding-left: 40px;
}
.final_msg_error {
font-weight: bold;
color: red;
font-family: Georgia,Verdana;
padding-left: 40px;
}
EOF
print "</style>";
# if connection to some of server was fail set to 0 and print error message
my $sync_success = 1;
my $sync_error_msg = 'ERROR: Some or all domains were not synchronized!!!';
my $sync_success_msg = 'SUCCESS: All domains were synchronized to hosting DNS!';
if ($queryString{'all_domains'} == 1) {
$user_2proceed = &get_domain_owner_login ($queryString{'onezonelocal'});
if ($user_2proceed ne '') {
$CleanDomains = &get_domain_list ($user_2proceed);
my $idomain;
print "<br><span class='middletitle'>Query to Verisign</span> <br>";
foreach $idomain (@$CleanDomains) {
# check for blacklist
if (&readconfig::isBlackListed($conf_file, $idomain)) {
next;
}
my $rmmget = DNSRepl->new(hostname => $idomain, operation => 'read');
my ($retcode, $message) = $rmmget->run();
if ($retcode == 200) {
my $rmm = DNSRepl->new(hostname => $idomain, operation => 'update');
my ($retcode, $message) = $rmm->run();
print "<br><span class='leftpadded'>Updating <b>".$idomain."</b> on Verisign</span>\n";
&readconfig::do_syslog ($Conf->{syslog}, 1, "switchmaster.cgi_SyncAllUserDomains: '$idomain' update queued to AMQP ($message)");
} else {
my $rmm = DNSRepl->new(hostname => $idomain, operation => 'insert');
my ($retcode, $message) = $rmm->run();
if ($retcode == 202) {
print "<br><span class='leftpadded'>Adding <b>".$idomain."</b> to Verisign</span>\n";
&readconfig::do_syslog ($Conf->{syslog}, 1, "switchmaster.cgi_SyncAllUserDomains: '$idomain' queued to AMQP");
} elsif ($retcode == 403) {
print "<span class='leftpadded' style='color:red'>Failed to add <b>".$idomain."</b> to Verisign ($message)</span>\n";
&readconfig::do_syslog ($Conf->{errlog}, 1, "switchmaster.cgi_SyncAllUserDomains: '$idomain' $message");
} else {
print "<span class='leftpadded' style='color:red'>Failed to add <b>".$idomain."</b> to Verisign</span>\n";
&readconfig::do_syslog ($Conf->{syslog}, 10, "switchmaster.cgi_SyncAllUserDomains: '$idomain' was NOT queued to AMQP");
}
}
}
print "<hr style='color: #f00; background-color: #f00; height: 5px;'>";
if ($sync_success > 0) {
print "<span class='final_msg_success'>$sync_success_msg</span>\n";
&readconfig::do_syslog ($Conf->{syslog}, 1, "switchmaster.cgi_SyncAllUserDomains: $sync_success_msg");
} else {
print "<span class='final_msg_error'>$sync_error_msg</span>\n";
&readconfig::do_syslog ($Conf->{syslog}, 10, "switchmaster.cgi_SyncAllUserDomains: $sync_error_msg");
}
} else {
print "<b style='color: red;'>Invalid input or user not found!!!<b>";
&readconfig::do_syslog ($Conf->{syslog}, 10, "switchmaster.cgi_SyncAllUserDomains: ERROR: Invalid input or user not found!!!");
}
} else { # if ($queryString{'all_domains'} == 1)
my $dom = $queryString{'onezonelocal'};
$user_2proceed = &get_domain_owner_login($dom);
# check if zone exist
open (TEST,'<', "/var/named/$dom.db") or print "<b style='color: red;'>ERROR: no such zone $dom.db file in /var/named/<b>" and &readconfig::do_syslog ($Conf->{syslog}, 10, "switchmaster.cgi_SyncSingleZone: ERROR: No such zone $dom.db file in /var/named/") and return;
# check for blacklist
if (&readconfig::isBlackListed($conf_file, $dom)) {
&readconfig::do_syslog ($Conf->{syslog}, 10, "switchmaster.cgi: '$dom' blacklisted");
return;
}
if ($user_2proceed ne '') {
my $rmmget = DNSRepl->new(hostname => $dom, operation => 'read');
my ($retcode, $message) = $rmmget->run();
if ($retcode == 200) {
my $rmm = DNSRepl->new(hostname => $dom, operation => 'update');
print "<span>Updating <b>".$dom."</b> on Verisign</span>\n";
my ($retcode, $message) = $rmm->run();
&readconfig::do_syslog ($Conf->{syslog}, 1, "ardtool_SyncAllUserDomains: '$dom' update queued to AMQP ($message)");
} else {
my $rmm = DNSRepl->new(hostname => $dom, operation => 'insert');
my ($retcode, $message) = $rmm->run();
if ($retcode == 202) {
print "<span>Adding <b>".$dom."</b> to Verisign</span>\n";
&readconfig::do_syslog ($Conf->{syslog}, 1, "switchmaster.cgi_SyncSingleZone: '$dom' was queued to AMQP");
} elsif ($retcode == 403) {
print "<span>Failed to add <b>".$dom."</b> to Verisign ($message)</span>\n";
&readconfig::do_syslog ($Conf->{errlog}, 1, "switchmaster.cgi_SyncSingleZone: '$dom' $message");
} else {
print "<span>Failed to add <b>".$dom."</b> to Verisign</span>\n";
&readconfig::do_syslog ($Conf->{syslog}, 10, "switchmaster.cgi_SyncSingleZone: '$dom' was NOT queued to AMQP");
}
}
} else { # if ($user_2proceed ne '')
print "<b style='color: red;'>Invalid input or user not found!!!<b>";
&readconfig::do_syslog ($Conf->{syslog}, 10, "switchmaster.cgi_SyncSingleZone: ERROR: with '$dom' Invalid input or user not found!!!");
}
} # if ($queryString{'all_domains'} == 1)
# --------------------------------------- S U B R O U T I N G S ----------------------------------------
#
# get_domain_list ( login )
#
# Input:
# user's login
#
# Return:
# ref to domain names list (@);
#
sub get_domain_list ($) {
my $login = shift;
my @DomainList;
my @userdomains;
my $maindomain;
# get user's master domain first
open (FH,'<', "/var/cpanel/users/$login");
while (<FH>) {
chop();
if ($_ =~ m/^DNS=(.+)$/) {
$maindomain = $1;
print "<br><span class='middletitle'>Main domain: <b style='color:green'> $maindomain </b></span><br>\n";
push (@userdomains, $maindomain);
last;
}
}
close(FH);
open (FH,'<', "/var/cpanel/users/$login");
print "<br><span class='middletitle'>The following DNS records were found</span> <br>";
while (<FH>) {
chop; # strip 'new line'
if ($_ !~ m/$maindomain/) {
if ($_ =~ m/^DNS\d+\s*=\s*(?:\*)?(.+)$/o) {
push (@userdomains, $1);
print "<span class='leftpadded' style='color: grey;'>" .$1 ."</span><br>";
}
}
}
close (FH);
my $cleanflag=1;
if (scalar(@userdomains) > 0) {
print "<br><span class='middletitle'>The following DNS zones will be synced</span> <br>";
}
for (my $i=0; $i < scalar(@userdomains); $i++) {
$cleanflag=1;
for (my $j=0; $j < scalar(@userdomains); $j++) {
if ( $i != $j ) {
if ($userdomains[$i] =~ m/$userdomains[$j]$/) {
$cleanflag=0;
last;
}
}
}
if ($cleanflag) {
push (@DomainList, $userdomains[$i]);
print "<span class='leftpadded' style='color: green;'>" .$userdomains[$i] ."</span><br>";
}
}
return \@DomainList;
}
#
# get_domain_owner_login ( domain )
#
# Input:
# domain name
# Returns:
# owner's login name or '' if domain not found
#
sub get_domain_owner_login ($) {
my $domain = shift;
my $user_login = '';
open(FH, "/etc/userdomains");
while (<FH>) {
if (/^$domain: (\S+)/io) {
$user_login = $1;
print "<span class='middletitle'>Processing domain <i style='color: brown;'>$domain</i> owned by user:<b style='color: green;'> $user_login </b></span><br>";
last;
}
}
close(FH);
return $user_login;
}
Back to Directory
File Manager