jgWddlmZddlmZddlmZddlZddlZddlZddlmZddlm Z ddl m Z dd l mZmZdd lmZdd lmZGd d eZdS))absolute_import)print_function)divisionN)glob)map) configparser)ClSelectExceptBaseClSelectException)clprint) in_cagefsceZdZerdndZedZedZdZedZedZ edZ d Z d Z d Z d Ze ezZe ezZd Ze ezZe ezZedZedZd2dZdZdZdZdZdZdZd3dZdZdZ dZ!dZ"d3dZ#dZ$d4d!Z%d"Z&ee&Z&d#Z'ee'Z'd$Z(ee(Z(d5d&Z)d'Z*d(Z+d)Z,d*Z-d6d+Z.d6d,Z/d-Z0d4d.Z1d/Z2d3d0Z3d6d1Z4d S)7ClSelectz/etc/cl.selector.conf.dz/etc/cl.selectorz/selector.confz /defaults.cfgz /usr/bin/phpz /native.confz /user.confz/php.extensions.d/z/usr/sbin/cagefsctlz/var/lvez/var/lve/php.dat.dz /php%s.datz/php_native_ver.datctrdS ddlm}m}n#t$rt dwxYw|s|st ddSdS)Nr!multiphp_system_default_is_ea_phpselector_modules_must_be_usedzCageFS not installed.zesystem default PHP version is alt-php. PHP Selector is disabled. Use cPanel MultiPHP manager instead.)r clcagefslib.selector.configurerr ImportErrorr rs H/opt/cloudlinux/venv/lib64/python3.11/site-packages/clselect/clselect.py%check_multiphp_system_default_versionz.ClSelect.check_multiphp_system_default_version/s ;;  F A w w w w w w w w w A A A'(?@@ @ A1022 Q;X;X;Z;Z Q')PQQ Q Q Q Q Qs5cTtjtjSN)ospathexistsr USER_CONFrwork_without_cagefszClSelect.work_without_cagefs<sw~~h0111rphpc||_||_i|_i|_t |_d|_t |_ | dSr) _item_get_default_config_handler_dh_selector_contents_native_contentsset_hidden_extensions_native_versionrr without_cagefs_load_config_files)selfitems r__init__zClSelect.__init__@sl 3355"$ ""%%%#&::<< !!!!!rcfdtjdffdtjfg}|D]\}}|r|dS)NchtjdS)Ncli)rrr_get_native_pathr-srz-ClSelect.check_requirements..Ns#t'<'.Rs Erw~~dn'E'Er)r NativeNotInstalledr3MissingCagefsPackage)r- utilities predicateerrors` rcheck_requirementszClSelect.check_requirementsJsEDDD1$2G2G2N2NOO  FEEE355   !*   Iuy{{ K  rcttj|jdD]}||dS)Nz*.cfg)rrrjoin CONFIGS_DIR_load_config_file)r-filenames rr,zClSelect._load_config_files\sMRW\\$*:GDDEE - -H  " "8 , , , , - -rctjdd} ||n=#tj$r+}t j|dt |zd}~wwxYw |j| dd ddS#tj tj f$rYdSwxYw)NF interpolationstrictzConfig is malformed, error: %smessage extensionshide_extensions,) ConfigParserSafeConfigParserreadErrorr FileProcessErrorstrr)updategetsplitNoSectionError NoOptionError)r-filepathdhes rrAzClSelect._load_config_file`s  *e L L L M GGH    ! M M M 1"BSVV"KMMM M M   # * *|%677==cBB D D D D D+\-GH    DD s'.A(&A##A(,AB//C Cc,|}g}t|D]N} ||||d||d|jf?#t $rYKwxYwt |S)zM Returns alternatives summary as tuple :rtype: tuple versiondata)get_all_alternatives_datasortedkeysappendr#KeyErrortuple)r- alternativeslist_of_alternativesalts rlist_alternativeszClSelect.list_alternativesos 5577 !,++--..  C $++!#&y1!#&v.tz:<====    )***s;A77 BBc|js9 |n##tjtjf$ricYSwxYw|jS)a Returns dict of all selector config contents. If no data loads them :return: {'4.4': {'version': '4.4.9', 'data': {'lsphp': '/opt/alt/php44/usr/bin/lsphp', 'php.ini': '/opt/alt/php44/etc/php.ini', 'php': '/opt/alt/php44/usr/bin/php-cgi', 'php-cli': '/opt/alt/php44/usr/bin/php'}}} :rtype: dict )r&_load_alternatives_configr ConfigNotFoundWrongConfigFormatr4s rr]z"ClSelect.get_all_alternatives_datasa&  ..0000"1>3ST     &&s >>c|js| ||j|iS#t$rtj|wxYw)z Returns selector config contents of certain version as dict. If no data loads them @param version: string, selector version @return: dict )r&rhrar NoSuchAlternativeVersionr-r[s rget_alternatives_datazClSelect.get_alternatives_datasj& -  * * , , , CT4W=> > C C C 9'BB B Cs ,A Fc|} |jd|j}|||d||d|jfS#tjt f$r||cYSwxYw)z/ Gets default selector version versionsr[r\)r]r%rSr#rLrUra_compose_native_info)r-show_native_versionrcr[s r get_versionzClSelect.get_versions5577  Bhll:tz::GW%i0W%f-dj9; ;+X6 B B B,,-@AA A A A BsAA+B  B c|}|||||jd|j|j|f}|d||jdS)z/ Sets default selector version )rp N)r]_check_alternative_process_ini_file DEFAULTS_PATH_add_or_change_optionr#_write_to_filer?r-r[rcdefaults_contentss r set_versionzClSelect.set_versions5577  666 22     & Z ! ##  II' ( ($*< > > > > >rc|}|||||j|j|f|jd}|d||jdS)z5 Removes disabled state from version stateruN)r]rvrwrxr#_remove_optionrzr?r{s renable_versionzClSelect.enable_versions5577  666 22   Z !      II' ( ($*< > > > > >rc|}|||||j|j|f|jd}|d||jdS)z- Marks a vesrion as disabled )rdisabledruN)r]rvrwrxr#ryrzr?r{s rdisable_versionzClSelect.disable_versions5577  666 22   Z !  & ! ##  II' ( ($*< > > > > >rcL|j|j|d S)z Method that allows you to check if some version is enabled in config. E.g. is_version_enabled('5.4') -> True :rtype: bool r)r% has_optionr#rms ris_version_enabledzClSelect.is_version_enableds3 8&&jj'' *G555 5rcL|}||}ddddi}t|dgz}|D]4}||vri||<||||d<d||d<5 |jd|j}n##tj tj f$rd}YnwxYw d||d<n"#t$rtj |wxYw|d||d<|d||dt#t%|D]+}||} | || d|| dff||<,t'|S) zl Returns state of alternatives @return: tuple[version, tuple[isEnabled, isDefault]] nativeTF)enableddefaultrrrpr)r]rqr^r_rr%rSr#rLrUrVrar rlpopremover`rangelenrb) r-rrrc native_infosummary alt_versionsr[default_versionidxvs r get_summaryzClSelect.get_summarys 5577 //0CDD %@@Al//1122hZ? # 0 0Gg%%#% *.*A*A'*J*JGG Y '*/GG Y ' ' '"hll:tzBBOO+\-GH ' ' '&OOO ' K26GO $Y / / K K K 9/JJ J K")++h"7"7 AH%%%KN+++\**++ ) )CS!AI&I&(!)L  \"""s B//CC CC>cZ t|j}|D]}|}|dkr|\}}}}|j|vr@||jvr i|j|<||j|d<d|j|vri|j|d<||j|d|<|jst jdddS#ttf$r'}t jd|jd|d dd}~wt$rt j |jwxYw) a Parses selector config file and fills an instance config dict. Example: {'4.4': {'version': '4.4.9', 'data': {'lsphp': '/opt/alt/php44/usr/bin/lsphp', 'php.ini': '/opt/alt/php44/etc/php.ini', 'php': '/opt/alt/php44/usr/bin/php-cgi', 'php-cli': '/opt/alt/php44/usr/bin/php'}}} :raises ClSelectExcept.ConfigNotFound: :raises ClSelectExcept.WrongConfigFormat: r[r\Nzalt-php packages not foundrGz Cannot read z: z . Native used) open CONFIG_PATHstriprTr#r&r riOSErrorIOError ValueErrorrj) r-fline stripped_liner. short_version long_version item_pathrYs rrhz"ClSelect._load_alternatives_configs ET%&&A Q Q $  B&&!.!4!4!6!6}l:T)) (???=?D+M:DP' 6yA!8!GGGEGD+M:6BGP' 6v>tDD* <$3D:<<<< < <! 8 8 8 //595E5E5EqqqI6888 8 E E E 243CDD D EsC CD*!"D'D*Nctjdd}t|_|r||n||j|S)z: Gets ConfigParser handler for future use NFrD)rLrQ optionxformrNrx)r-rrXs rr$z$ClSelect._get_default_config_handler'sS &T% H H H  ( GGDMMMM GGD& ' ' ' rcF|dkr||vrtj|dSdS)Nr)r rl)r[rcs rrvzClSelect._check_alternative3s6 h  7,#>#> 9'BB B  #>#>rc^dddgt|zz}||zS)z Gets section header data tuple and returns ini section header string @param section_info: tuple @return: string z[%s]rz%s)r?r) section_info section_fmts r_make_section_headerzClSelect._make_section_header8s4 rwwvL0A0A'ABBB \))rcttd|}|r |ddkr|d|S)zN Removes empty lines from list and appends newline if missing c|dkS)Nrr)is rr5z'ClSelect._smooth_data..Fs a2grru)listfilterr`)r\s r _smooth_datazClSelect._smooth_dataBsLF--5566 tBx4'' KK    rTc fg}g}g} d} d} d} ||} t|}|D]}|}|dr_d} d|vrd} | |krd} t |dkr||g}|||| |||g} | r| ||||||| |||n#ttf$rYnwxYw| s(d| vr$dd|j zdg}|||}| s | d}n#tj $rYnwxYw|d kr:|||| d d |zg||n`|d kr8|||||| g||n"|||| g|||S) z Parses ini file by sections, calls supplied callable to modify section is question, returns file as list of strings F[Tz [versions]rz %s = nativerrdisable_extentionsz modules = rKenable_extentions)rrr startswithrextendr`closerrr# _get_builtinsr UnableToGetExtensionsr?)r-rrfunctionr\traceactioncontentsno_section_contentssection in_sectionfound has_defaultsection_headerrrrbuild_ins rrwzClSelect._process_ini_fileLs    22<@@ T A 5 5zz||??3'' !%J#t++&* %-- $.//144 (;<<<.0+OOHH\7D%$P$PQQQ#fG5NN4(((('..t4444 OOHH\7D%HH I I I GGIIII!    D  |>AA#]TZ%?DG NN8 $ $ $H W --h77!7    --- WZW_W_`hWiWiHi7jlprw x xyyyy... H%%%7Gu U UVVVV7Gu U UVVVs$C>D""D65D6&E<<F Fcd|jz}|} ||d|}n&#t$r|d}YnwxYw|S)z Retrives path to php binary for supplied version :param version: php version to retrive path :return: path to php binary. If alternative version not found native php binary path returned z%s-clir\r2)suffix)r#r]rar3)r-r[r.rcrs r_get_php_binary_pathzClSelect._get_php_binary_pathsv $*$5577  7(06DD 7 7 7(((66DDD 7 s5 AAc|}d|di}|D]}||||<|S)a Retrives paths to php binary for all versions :return: Dictionary version -> path. Example: { '5.2': '/opt/alt/php52/usr/bin/php', '5.3': '/opt/alt/php53/usr/bin/php', 'native': '/usr/bin/php' } r)r]rr_)r-rc paths_dictr[s rget_all_php_binaries_pathsz#ClSelect.get_all_php_binaries_pathssk5577  9 9( C CD #((** E EG"&";";G"D"DJw  rctr |j|zn |j|z}t|d5}|cdddS#1swxYwYdS)z Retrives contents of cache file for supplied php version :param version: PHP version to read file :return: file contents rN)r CACHEFILE_CAGEFS_PATTERNCACHEFILE_PATTERNrrN)r-r[rBrs r_read_php_cache_filezClSelect._read_php_cache_files ?Hkko407::tOehoOo (C  A6688                  sAAAcdg} ||}n)#ttf$rtj|wxYwd\}}||||}}|dkrdn|t |z}|||}tjd} | dD]p} | | sd tj d| } | |j vr|| q|S)z Gets php extensions from the /var/lve/phpX.X.dat cache file, which contains list of modules that are either compiled-in or enabled in /opt/alt/phpXX/etc/php.ini config file )z [PHP Modules]z[Zendrrz\wru_z\s+)rrrr rfindrrecompilerTmatchr?lowerr)r`) r-r[builtinsoutput start_pattern end_pattern start_index end_index modules_listmodule_patternextmodules rrzClSelect._get_builtinssE  @..w77FF! @ @ @ 6w?? ? @ &>" {!']!;!;V[[=U=UY &",,aa+M@R@R2R k)34 E**%%d++ ( (C!'',, XXbhuciikk::;;FT444'''s &Ac||}t|dks ||dkr|S|tt fd|S)z Adds 'modules' option to section or extends it @param section_info: tuple (item and version) @param section: list @param data: string @return: list rc0| Sr)r)rr\s rr5z)ClSelect._remove_option..sq||D'9'9#9r)rrrrr)r-rrr\rrs ` rrzClSelect._remove_optionsv22<@@ w<<1  '!* < <N  9999GDD E EGG Grch||}t|dks ||dkr|Sd}tt|D]'}|||dr|}n(d|z}|r|||<n||||S)z Adds 'modules' option to section or extends it @param section_info: tuple @param section: list @param data: tuple @return: list rNz%s = %s)rrrrr`r) r-rrr\rroidxroptions rryzClSelect._add_or_change_options22<@@ w<<1  '!* < <NW&&  Cs|&&tAw//  T!  #"GDMM NN6 " " "  )))rc t|d}|d|z|dS#ttf$r}t j||d}~wwxYw)z$ Saves data to file wz%s N)rwriterrrr UnableToSaveData)r- file_contents file_pathrrYs rrzzClSelect._write_to_filesz @Y$$A GGF]* + + + GGIIIII! @ @ @ 1)Q?? ? @s.srN) r NATIVE_CONFrrrrTr'DEFAULT_PHP_PATHrrr)r-valuerrr.rs rrzClSelect._load_native_contents s  AT%&&A 3 3??3''$$d??!#':':TZZ__"M"MNN d.2%d++D111/3/D%e, GGIIIII! A A A+/+@D !% ( ( ( ( AsB#B'' C  C c|sdd|fS|d}|r+d|ddd|dd|fSdd|fS)NrF)verboseznative (r)r )r3get_native_version)r- show_versionnative_versions rrqzClSelect._compose_native_info s ?Xt'<'<'>'>> >000??  - -%3A%6%6%688%3A%6%6%68))++- -4#8#8#:#:::rc"|jr|jStjd} t|jd}|}|nF#ttf$r2}|r%tj ddt|dYd}~dSd}~wwxYw| D]R}| |}|r9|d|d} }|| f|_|| fcSSdS)Nz(PHP\s+(?P(?P\d+\.\d+)\.\d+)rtextERROR)statusrHshortfull)r*rrrCACHEFILE_NATIVE_VER_PATTERNrNrrrr print_diagrQ splitlinesrgroup) r-rversion_patternrr\rYrmrrs rrzClSelect.get_native_version*s1   (' '*%PQQ T6<A]*]' Q Q\ Q22\2""""$---   +++$'''$ C C C B B B B > > > > > > > > >555####B"E"E"EH    CCC&&899***(<(<== < --L5555n      : G G G G****. @ @ @1111&AAA,;;;;rr) __future__rrrrrsysrrr future.movesrrLclselectexceptr r clselectprintr clselect.utilsr objectrrrrr s'&&&&&%%%%%% 555555AAAAAAAA""""""$$$$$$dddddvdddddr