????

Your IP : 18.222.97.216


Current Path : /proc/322176/root/scripts/
Upload File :
Current File : //proc/322176/root/scripts/exportmydnsdb

#!/usr/local/cpanel/3rdparty/bin/perl

# cpanel - scripts/exportmydnsdb                   Copyright 2022 cPanel, L.L.C.
#                                                           All rights reserved.
# copyright@cpanel.net                                         http://cpanel.net
# This code is subject to the cPanel license. Unauthorized copying is prohibited

use strict;
use Cpanel::MysqlUtils::Connect     ();
use Cpanel::NameServer::Conf::Mydns ();
use Cpanel::PID                     ();
use Cpanel::SafeRun::Errors         ();
use Cpanel::SafeFile                ();
use Cpanel::Usage                   ();

use Try::Tiny;

my ( $force, $debug );
Cpanel::Usage::wrap_options( \@ARGV, \&usage, { 'force' => \$force, 'debug' => \$debug } );

if ( $> != 0 ) {
    die "Insufficient permission to update zone files\n";
}

my $pid_obj = Cpanel::PID->new( { 'pid_file' => '/var/run/exportmydnsdb.pid' } );
unless ( $pid_obj->create_pid_file() > 0 ) {
    die "Exportmydnsdb appears to be running already. Please wait for the export to finish before attempting another.\n";
}

my $namedconf_obj = Cpanel::NameServer::Conf::Mydns->new();
$namedconf_obj->initialize();
$namedconf_obj->check_zonedir_cache();
my $bind_dir    = $namedconf_obj->{'config'}->{'zonedir'};
my $mydnsexpbin = $namedconf_obj->{'mydnsexpbin'};

die "mydnsexport is missing from your system.\n" unless ( -x $mydnsexpbin );

my $dbh;
try {
    $dbh = Cpanel::MysqlUtils::Connect::get_dbi_handle();
}
catch {
    die "Error while connecting to MySQL database: $_";
};

my $settings_ref = $namedconf_obj->{'dns_settings'};
my $soa_table    = $settings_ref->{'database'} . '.' . $settings_ref->{'soa-table'};

my $get_zones_query = qq {
    SELECT origin FROM $soa_table
    };

my $sth = $dbh->prepare($get_zones_query);
unless ($sth) {
    die "Database error, unable to get zones from MyDNS " . $dbh->errstr;
}
unless ( $sth->execute() ) {
    die "Database error, unable to get zones from MyDNS " . $dbh->errstr;
}

my @database_zones = ();
while ( my $data = $sth->fetchrow_hashref() ) {
    $data->{'origin'} =~ s/\.$//;
    push @database_zones, $data->{'origin'};
}
$sth->finish;

print "Exporting zones from MyDNS database\n";
my $counter = 0;
foreach my $zone (@database_zones) {
    my ( $zonefile, $zonedata );
    $zonefile = $bind_dir . '/' . $zone . '.db';

    if ( !$force && -e $zonefile ) {
        if ($debug) {
            print "$zonefile already exists, not updated\n";
        }
        next;
    }

    $zonedata = Cpanel::SafeRun::Errors::saferunnoerror( $mydnsexpbin, $zone );
    unless ( $zonedata =~ /mydnsexport\s+$zone/i ) {
        print "Error exporting $zone\n";
        next;
    }

    my ( $zonelock, $zone_fh );
    unless ( $zonelock = Cpanel::SafeFile::safeopen( $zone_fh, '>', $zonefile ) ) {
        print "Unable to write $zonefile\n";
        next;
    }

    print $zone_fh $zonedata;
    Cpanel::SafeFile::safeclose( $zone_fh, $zonelock );

    $counter++;
    if ($debug) {
        print "$zone is successfully saved\n";
    }
}

print "$counter zones have been successfully exported\n";

if ( $counter > 0 ) {
    print "Rebuilding named.conf file\n";
    system('/usr/local/cpanel/scripts/rebuilddnsconfig');
}

print "Exportmydnsdb has completed\n";
$pid_obj->remove_pid_file();
exit 0;

sub usage {
    print <<EO_USAGE;
Usage: exportmydnsdb [options]

    Options:
      --help       Brief help message
      --force      Overwrite existing zone files
      --debug      Prints extra processing information
EO_USAGE
    exit 0;
}