serio:ty01pr00id00ex00
  "   ˆl–äY>”ªh¥8 _¸®Õ1hßÀƒqçž¿Ã è    #!/usr/local/cpanel/3rdparty/bin/perl
# cpanel - ea_sync_user_phpini_settings              Copyright 2017 cPanel, Inc.
#                                                           All rights Reserved.
# copyright@cpanel.net                                         http://cpanel.net
# This code is subject to the cPanel license. Unauthorized copying is prohibited

package ea_sync_user_phpini_settings;

use strict;

use Cpanel::Config::Httpd   ();
use Getopt::Param::Tiny     ();
use Cpanel::PwCache         ();
use Cpanel::AccessIds       ();
use Cwd                     ();
use Path::Iter              ();
use Cpanel::ProgLang        ();
use Cpanel::ArrayFunc::Uniq ();
use Cpanel::Version         ();

#### barf ##
# <facepalm> paths before ULC in INC can cause the user-run-code to error out with things like:
#    Can't locate Cpanel/Exception/CORE.pm:   /root/perl5/lib/perl5//x86_64-linux-64int/Cpanel/Exception/CORE.pm: Permission denied at /usr/local/cpanel/Cpanel/Exception.pm line 43.
#    Can't locate Cpanel/Carp.pm:   /root/perl5/lib/perl5//x86_64-linux-64int/Cpanel/Carp.pm: Permission denied at (eval .*) line 1.
# etc, on and on down the rabbit hole depending on how you try to hack around it
while ( $INC[0] ne '/usr/local/cpanel' ) { shift @INC }
#### /barf ##

our ( $php_version_info, $php, $ini_hr );

exit( run(@ARGV) ) unless caller;

sub run {
    my (@args) = @_;

    die "This script can only be run by root\n" if $> != 0;

    die "This script only operates when you are under EasyApache 4\n" if !Cpanel::Config::Httpd::is_ea4();

    # Handle v58 grossfully (not a typo)
    eval 'require Cpanel::PHP::Config;';
    if ( $@ || !defined &Cpanel::Version::get_short_release_number || Cpanel::Version::get_short_release_number() < 62 ) {
        print "Nothing to do (only applies to v64 and newer)\n";
        exit(0);
    }

    my $param = Getopt::Param::Tiny->new( { array_ref => \@args, help_coderef => \&_help, known_only => [ 'user', 'all-users' ], no_args_help => 1, validate => \&_validate, } );

    my $starting_dir = Cwd::cwd();
    $php_version_info = Cpanel::PHP::Config::get_php_version_info();
    die "There are no PHP packages installed via ea4\n" if !@{ $php_version_info->{versions} };

    $php = Cpanel::ProgLang->new( type => 'php' );
    $ini_hr = {};

    my @users;
    if ( $param->param('all-users') ) {
        require Cpanel::Config::LoadUserDomains;
        require Cpanel::PwCache;

        Cpanel::PwCache::Build::init_passwdless_pwcache();
        my %user_map = Cpanel::Config::LoadUserDomains::loaduserdomains( undef, 0, 1 );
        @users = sort keys %user_map;
    }
    else {
        @users = $param->param('user');
    }

    for my $user (@users) {
        print "Operating on â€œ$userâ€� â€¦\n";
        _process_user($user);
        print " â€¦ done!\n";
    }

    chdir($starting_dir) or die "Could not chdir back to $starting_dir: $!\n";

    return 0;    # exit clean
}

###############
#### helpers ##
###############

sub _process_user {
    my ($user) = @_;

    my $user_ar      = [ Cpanel::PwCache::getpwnam($user) ];
    my $user_homedir = $user_ar->[7];

    my $user_php = Cpanel::PHP::Config::get_php_config_for_users( [$user] );
    my $user_dir_to_package_map = {};
    for my $dom ( sort keys %{$user_php} ) {
        next if exists $user_dir_to_package_map->{ $user_php->{$dom}{documentroot} };
        $user_dir_to_package_map->{ $user_php->{$dom}{documentroot} } = $user_php->{$dom}{phpversion};
    }

    my $count = Cpanel::AccessIds::do_as_user( $user, sub { return _proc_dir( $user_homedir, $user_dir_to_package_map ) } );

    if ( !$count->{errors} && !$count->{processed} ) {
        print "\tNo php.ini files found.\n";
    }
    else {
        $count->{processed} ||= 0;
        $count->{errors}    ||= 0;
        print "\tSuccessfully processed php.ini files: $count->{processed}\n";
        print "\tphp.ini files that had errors during processing: $count->{errors}\n";
    }
}

sub _proc_dir {
    my ( $user_homedir, 