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 );
}
}