MOON
Server: Apache/2.2.31 (Unix) mod_ssl/2.2.31 OpenSSL/0.9.8e-fips-rhel5 mod_bwlimited/1.4
System: Linux csr818.wilogic.com 2.6.18-419.el5xen #1 SMP Fri Feb 24 22:50:37 UTC 2017 x86_64
User: digitals (531)
PHP: 5.4.45
Disabled: NONE
Upload Files
File: //proc/self/root/scripts.20110531.215904.25158/ensure_vhost_includes
#!/usr/bin/perl
# cpanel - ensure_vhost_includes                  Copyright(c) 2010 cPanel, Inc.
#                                                           All rights Reserved.
# copyright@cpanel.net                                         http://cpanel.net
# This code is subject to the cpanel license. Unauthorized copying is prohibited

BEGIN { unshift @INC, '/usr/local/cpanel'; }

# use strict;
# use warnings;
use Cpanel::CPAN::Getopt::Param         ();
use Cpanel::EditHttpdconf               ();
use Cpanel::Services                    ();
use Cpanel::Config::LoadUserDomains     ();
use Cpanel::DataStore                   ();
use Cpanel::PwCache                     ();
use Cpanel::PHPINI                      ();
use Cpanel::AcctUtils::DomainOwnerCache ();
use Cpanel::AcctUtils::Owner            ();
use Cpanel::AdvConfig::apache::vhost    ();
use Cpanel::DomainTools                 ();

my %errors;
my @PHP_INI_INCLUDE_PATHS_CACHE;
my $php_ini_include_paths_have_been_cached = 0;

Cpanel::AcctUtils::DomainOwnerCache::cachedomainowners();

# Not Needed
#Cpanel::AcctUtils::Owner::build_trueuserowners_cache();

my %checks = (
    'cp_bw_all_limit.conf' => {
        'name' => 'bandwidth limit',

        # 'user' ...
        'domain' => {
            'on' => sub {
                my ( $user, $domain, $value, $verbose ) = @_;
                if ( -x '/scripts/setbwlimit' ) {
                    system '/scripts/setbwlimit', '--domain=' . $domain, '--limit=' . $value;
                }
                else {
                    if ( !exists $errors{'/scripts/setbwlimit missing or not executable!'} ) {
                        print "/scripts/setbwlimit missing or not executable!\n";
                        $errors{'/scripts/setbwlimit missing or not executable!'} = 0;
                    }
                    $errors{'/scripts/setbwlimit missing or not executable!'}++;
                }
            },
            'off' => sub {
                my ( $user, $domain, $value, $verbose ) = @_;
                Cpanel::EditHttpdconf::del_vhost_include(
                    {
                        'domain'                          => $domain,
                        'file'                            => 'cp_bw_all_limit.conf',
                        'restart_apache'                  => 0,
                        'ensure_vhost_include_directives' => 0,
                    }
                );
            },
        },
    },
    'cp_jkmount.conf' => {
        'name' => 'tomcat setting',

        # 'user' ...
        'domain' => {
            'on' => sub {
                my ( $user, $domain, $value, $verbose ) = @_;
                if ( -x '/scripts/addservlets2' ) {
                    system '/scripts/addservlets2', '--domain=' . $domain;
                }
                else {
                    if ( !exists $errors{'/scripts/addservlets2 missing or not executable!'} ) {
                        print "/scripts/addservlets2 missing or not executable!\n";
                        $errors{'/scripts/addservlets2 missing or not executable!'} = 0;
                    }
                    $errors{'/scripts/addservlets2 missing or not executable!'}++;
                }
            },
            'off' => sub {
                my ( $user, $domain, $value, $verbose ) = @_;
                Cpanel::EditHttpdconf::del_vhost_include(
                    {
                        'domain'                          => $domain,
                        'file'                            => 'cp_jkmount.conf',
                        'restart_apache'                  => 0,
                        'ensure_vhost_include_directives' => 0,
                    }
                );
            },
        },
    },
    'cp_php_magic_include_path.conf' => {
        'name' => 'magic php include path',

        # 'user' ...
        'domain' => {
            'on' => sub {
                my ( $user, $domain, $value, $verbose ) = @_;
                my $homedir = ( Cpanel::PwCache::getpwnam $user )[7];

                if ( !$php_ini_include_paths_have_been_cached ) {
                    @PHP_INI_INCLUDE_PATHS_CACHE = Cpanel::PHPINI::include_paths();
                    $php_ini_include_paths_have_been_cached++;
                }

                my @INCP = @PHP_INI_INCLUDE_PATHS_CACHE;
                if ( $homedir && $homedir ne '' && $homedir ne '/' ) {
                    push @INCP, $homedir . '/php';
                }
                my $php5path = join( ':', @INCP );
                my $first_include = shift @INCP;
                unshift @INCP, '/usr/local/php4/lib/php';
                unshift @INCP, '/usr/php4/lib/php';
                unshift @INCP, $first_include;
                my $php4path = join( ':', @INCP );
                my $content = <<"END_CONT";
    <IfModule concurrent_php.c>
       php4_admin_value include_path "$php4path"
       php5_admin_value include_path "$php5path"
    </IfModule>
    <IfModule !concurrent_php.c>
       <IfModule mod_php4.c>
          php_admin_value include_path "$php4path"
       </IfModule>
       <IfModule mod_php5.c>
          php_admin_value include_path "$php5path"
       </IfModule>
       <IfModule sapi_apache2.c> 
          php_admin_value include_path "$php4path"
       </IfModule>
    </IfModule>

END_CONT

                Cpanel::EditHttpdconf::add_vhost_include(
                    {
                        'user'                            => $user,
                        'file'                            => 'cp_php_magic_include_path.conf',
                        'restart_apache'                  => 0,
                        'ensure_vhost_include_directives' => 0,
                        'content'                         => {
                            'std' => {
                                '1' => $content,
                                '2' => $content,
                            },
                            'ssl' => {
                                '1' => $content,
                                '2' => $content,
                            },
                        },
                    }
                );
                return 'once_per_user';
            },
            'off' => sub {
                my ( $user, $domain, $value, $verbose ) = @_;
                Cpanel::EditHttpdconf::del_vhost_include(
                    {
                        'user'                            => $user,
                        'file'                            => 'cp_php_magic_include_path.conf',
                        'restart_apache'                  => 0,
                        'ensure_vhost_include_directives' => 0,
                    }
                );
                return 'once_per_user';
            },
        },
    },
);

my $help_cr = sub {
    print <<"END_HELP";
Ensure all vhost includes are setup as per userdata.

$0 --help  (this screen)
$0 --all-users | --user=USERNAME1 [--user=USERNAME2 --user=...] | --domain=DOMAIN1 [--domain=DOMAIN2 --domain=...]

'--verbose' have output reporting what it is doing

'--skip-file-check' will skip the check that makes sure the setting in the userdata reflects what is on the filesystem

'--no-restart' will skip restarting Apache after httpd.conf is updated

'--skip-conf-rebuild' do not rebuild httpd.conf, implies --no-restart

'--debug' implies --verbose and makes the verbose information include more arcane information about what it's doing

END_HELP
    exit;
};

# purposefully don't have --force-value and --only-check in help

my $prm = Cpanel::CPAN::Getopt::Param->new(
    {    #issafe
        'help_coderef' => $help_cr,
    }
);

if ( $prm->exists_param('only-check') ) {
    my %only;
    for my $check ( $prm->get_param('only-check') ) {
        $only{$check} = 1 if exists $checks{$check};
    }

    for my $real_check ( sort keys %checks ) {
        delete $checks{$real_check} if !exists $only{$real_check};
    }

    die "--only-check arguments removed all checks" if !keys %checks;
}

my %user_map = %{ Cpanel::Config::LoadUserDomains::loaduserdomains( undef, 0, 1 ) };
my @users;
my $do_domain_filter = 0;

if ( $prm->get_param('all-users') ) {
    @users = sort keys %user_map;
}
elsif ( $prm->get_param('user') ) {
    foreach my $user ( $prm->get_param('user') ) {
        if ( $user && defined $user_map{$user} ) {
            push @users, $user;
        }
        else {
            print "Invalid user: $user\n";
        }
    }
    die "No valid --user arguments given" unless @users;
}
elsif ( $prm->get_param('domain') ) {
    $do_domain_filter = {};
    for my $dom ( $prm->get_param('domain') ) {
        $dom = Cpanel::DomainTools::normalize($dom);
        if ( Cpanel::DomainTools::is_valid($dom) ) {
            $do_domain_filter->{$dom}++;
        }
        else {
            print "Invalid domain: $dom\n";
        }
    }

    die "No valid --domain arguments given" unless keys %{$do_domain_filter};

  USER_NAME:
    for my $user ( keys %user_map ) {
      USER_DOM:
        for my $user_dom ( @{ $user_map{$user} } ) {
            if ( exists $do_domain_filter->{$user_dom} ) {
                push @users, $user;
                next USER_NAME;
            }
        }
    }

    die "--domain arguments do not belong to any user" unless @users;
}
else {
    $help_cr->();
}

my $verbose = $prm->get_param('debug') || $prm->get_param('verbose') ? 1 : 0;

my %domains_processed;

if ( $prm->get_param('skip-file-check') ) {
    print "Skipping file check as per --skip-file-check\n\n";
}
else {
    my $userdata = '/var/cpanel/userdata';
  USER:
    for my $user (@users) {
        my %once;
        print "Starting $user...\n" if $verbose;
        my $userdir = "$userdata/$user";
        next USER if !-d $userdir;
        next USER if ref $user_map{$user} ne 'ARRAY';

      DOM:
        for my $dom ( sort @{ $user_map{$user} } ) {

            if ( ref $do_domain_filter eq 'HASH' && !exists $do_domain_filter->{$dom} ) {
                print "\tProcessing $dom...\n\t\tSkipping $dom since it was not passed in via --domain flag\n" if $prm->get_param('debug');
                next DOM;
            }

            print "\tProcessing $dom...\n" if $verbose;

            my $domfile = "$userdir/$dom";
            next DOM if !-e $domfile;
            $domains_processed{$dom}++;

            my $vhost_hr = Cpanel::DataStore::fetch_ref($domfile);

          CHECK:
            for my $check ( sort keys %checks ) {
                next CHECK if exists $once{$check};

                print "\t\tChecking $checks{ $check }->{'name'}..." if $verbose;

                my $val = $prm->exists_param('force-value') ? $prm->get_param('force-value') : $vhost_hr->{$check};
                my @args = ( $user, $dom, $val, $verbose );

                my $rc;

                if ($val) {
                    print "On\n" if $verbose;
                    $rc = $checks{$check}->{'domain'}{'on'}->(@args);
                }
                else {
                    print "Off\n" if $verbose;
                    $rc = $checks{$check}->{'domain'}{'off'}->(@args);
                }
                $once{$check} = 1 if $rc eq 'once_per_user';
            }
        }
    }
}

if ( $prm->get_param('skip-conf-rebuild') ) {
    print "Skipping httpd.conf rebuild as per --skip-conf-rebuild\n" if $verbose;
    if ( $prm->get_param('skip-file-check') ) {
        print "Specifying both --skip-conf-rebuild and --skip-file-check means nothing was done.\n";
    }
}
else {
    print "Ensuring that Include entries are correct...\n" if $verbose;

    # ? other threshhold of when individual vhost building is less efficient than just rebuilding the entire httpd.conf ?
    if ( keys %domains_processed < 3 ) {
        for my $domain ( keys %domains_processed ) {
            Cpanel::AdvConfig::apache::vhost::do_vhost($domain) or warn("Could not rebuild vhost for $domain");
        }
    }
    else {
        Cpanel::EditHttpdconf::rebuild_httpd_conf(
            sub {
                my ( $line, $exit_loop_boolean_sr ) = @_;
                return $line;    # Cpanel::SafeRun::Dynamic::livesaferun() prints whatever is returned
            }
        );
    }

    local $Whostmgr::UI::nohtml = 1;
    if ( $prm->get_param('no-restart') ) {
        print "Skipping Apache restart as per --no-restart\n" if $verbose;
    }
    else {
        print "Restarting Apache...\n" if $verbose;
        Cpanel::Services::restartservice( 'httpd', 1, 1 );
    }
}