1
     �Âa–Ü4ý()¨‰P@ŠëŒ½pM)‹FÿÄ      File not found.
  "   ˆl–Ü4ý()¨‰P@ŠëŒ½pM)‹FÿÂƒh¹¿Å      00000029
  	   ˆ¾Â0¿Å  #   ˆl–Ãa¾”êeJq@ŠãO\d*bÑ¿Ã„�?ÀÆ ?÷     #!/usr/local/cpanel/3rdparty/bin/perl

#                                      Copyright 2024 WebPros International, LLC
#                                                           All rights reserved.
# copyright@cpanel.net                                         http://cpanel.net
# This code is subject to the cPanel license. Unauthorized copying is prohibited.

use strict;
use warnings;

use Cpanel::DNSLib                  ();
use Cpanel::OS                      ();
use Cpanel::FileUtils::Move         ();
use Cpanel::FileUtils::Copy         ();
use Cpanel::Path                    ();
use Cpanel::StringFunc::Count       ();
use Cpanel::StringFunc::Match       ();
use Cpanel::SafetyBits              ();
use Cpanel::NameServer::Conf        ();
use Cpanel::NameServer::Utils::BIND ();
use Cpanel::Validate::Domain::Tiny  ();
use Cpanel::DNSLib                  ();
use Cpanel::SafeDir::MK             ();

use Getopt::Std;
$Getopt::Std::STANDARD_HELP_VERSION = 1;

######[ declare some globals ]#####################################################################

# default location of zone files used for rebuilding named.conf
my $def_basedir;

# default location of named.conf
my $def_namedconf;

# default log directory for named
my $def_logdir;

# default location of pidfile
my $def_pidfile = '/var/run/named/named.pid';

# Verbose variable, if set to "1" actions are reported to STDOUT.
my $cpverbose = 0;

# We sent this to fixrndc, if it sends it back that means we've got a loop
my $selfcalled = 0;

my %options = ();
getopts( 'sfv', \%options );
if ( defined( $options{'v'} ) ) { $cpverbose  = 1; }
if ( defined( $options{'s'} ) ) { $selfcalled = 1; }

if ( $selfcalled == 1 ) {
    print "Loop detected, exiting.\n";
    exit;
}

######[ set defaults based on distro/OS ]##########################################################

$def_basedir   = Cpanel::OS::dns_named_basedir();    # /var/named
$def_namedconf = Cpanel::OS::dns_named_conf();       # /etc/named.conf
$def_logdir    = Cpanel::OS::dns_named_log();        # /var/log/named
my $perms_hr = Cpanel::OS::var_named_permissions();

######[ ensure base directory structure is created ]###############################################

my ( $chrootdir, $binduser, $bindgroup ) = Cpanel::NameServer::Utils::BIND::find_chrootbinddir();
my $binduid = getpwnam($binduser)  || die "$binduser not in passwd file";
my $bindgid = getgrnam($bindgroup) || die "$bindgroup not configured on the system";

# Set up directory structure
if ( !-d $def_basedir ) {
    if ( -e _ ) {
        Cpanel::FileUtils::Move::safemv( $def_basedir, $def_basedir . '.cpback' );
    }
    Cpanel::SafeDir::MK::safemkdir( $def_basedir, $perms_hr->{'mode'} );
}
else {
    chmod( $perms_hr->{'mode'}, $def_basedir ) or warn "Can't chmod $def_basedir to $perms_hr->{'mode'}: $!";
}
Cpanel::SafetyBits::safe_chown( $perms_hr->{'ownership'}->@*, $def_basedir );

# I would have added the above to iterator but for the differing owner on c9
my @dirs2create = ( "$def_basedir/data", $def_logdir, '/var/run/named' );
my @chrootdirs  = map { $chrootdir . $_ } qw{/etc /var /var/named /var/named/data /var/run /var/run/named};
push @dirs2create, @chrootdirs if $chrootdir;
foreach my $dir (@dirs2create) {
    Cpanel::SafeDir::MK::safemkdir_or_die( $dir, 0755 ) if !-e $dir;
    Cpanel::SafetyBits::safe_chown( $binduid, $bindgid, $dir );
}

my @rfc1912_files = qw{localdomain.zone named.broadcast named.ip6.local named.local named.zero named.rfc1912.zones};
if ( grep { !-e $_ } map { $def_basedir . "/$_" } @rfc1912_files ) {

    # RFC1912
    Cpanel::FileUtils::Copy::safecopy( '/usr/local/cpanel/scripts/named.rfc1912.zones', "$def_basedir/named.rfc1912.zones" );
    system 'tar', 'xvf', '/usr/local/cpanel/scripts/rfc1912_zones.tar', '-C', $def_basedir;    # uses new .tar without the ./named/ directory so we can use it for both
    if ($chrootdir) {
     