9eTddlmZddlmZddlmZddlZddlZddlZddlmZddlm Z ddl m Z ddl m Zd d lmZmZd d lmZGd d eZdS))absolute_import)print_function)divisionN)glob)map)FormattedException) configparser)ClSelectExceptBaseClSelectException)clprintcxeZdZdZdZdZdZdZdZdZ dZ e d zZ e d zZ e d Ze d Zd/dZdZdZdZdZdZdZd0dZdZdZdZdZd0dZdZd1dZdZe eZd Z e e Z d!Z!e e!Z!d2d#Z"d$Z#d%Z$d&Z%d'Z&d3d(Z'd3d)Z(d*Z)d1d+Z*d,Z+d0d-Z,d3d.Z-dS)4ClSelectz/etc/cl.selector/selector.confz/etc/cl.selector/defaults.cfgz /usr/bin/phpz/etc/cl.selector/native.confz/etc/cl.selector/user.confz"/etc/cl.selector/php.extensions.d/z/usr/sbin/cagefsctlz/var/lvez /php%s.datz/php_native_ver.datc dtjvrtjdddlm}m}n#t $rtdwxYw|s|stddSdS)Nz/usr/share/cagefsr!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.)syspathappend cagefsctlrr 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 A"#(22 3444 b b b b b b b b b A A A'(?@@ @ A1022 Q;X;X;Z;Z Q')PQQ Q Q Q Q Qs 58AcTtjtjSN)osrexistsr USER_CONFrwork_without_cagefszClSelect.work_without_cagefs3sw~~h0111r!phpc||_||_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__7sl 3355"$ ""%%%#&::<< !!!!!r!c|dtj|df|jtjfg}|D]&\}}t j|r%|dS)Ncli)_get_native_pathr NativeNotInstalled _CAGFSCTLMissingCagefsPackagerrr)r/ utilitiesrerrors rcheck_requirementszClSelect.check_requirementsAs " "5 ) )>+LTMbMbchMiMi+j+j k ^^@BB C %  KD%w~~d## K  r!cttj|jdD]}||dS)Nz*.cfg)rrrjoin CONFIGS_DIR_load_config_file)r/filenames rr.zClSelect._load_config_filesMsMRW\\$*:GDDEE - -H  " "8 , , , , - -r!ctjdd} ||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 rr>zClSelect._load_config_fileQs  *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_datasortedkeysrr%KeyErrortuple)r/ alternativeslist_of_alternativesalts rlist_alternativeszClSelect.list_alternatives`s 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 ConfigNotFoundWrongConfigFormat)r/s rrZz"ClSelect.get_all_alternatives_datarsa&  ..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(rdr]r NoSuchAlternativeVersionr/rXs 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 versionsrXrY)rZr'rPr%rIrRr]_compose_native_info)r/show_native_versionr_rXs 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 )rl N)rZ_check_alternative_process_ini_file DEFAULTS_PATH_add_or_change_optionr%_write_to_filer<r/rXr_defaults_contentss r set_versionzClSelect.set_versions5577  666 22     & Z ! ##  II' ( ($*< > > > > >r!c|}|||||j|j|f|jd}|d||jdS)z5 Removes disabled state from version staterqN)rZrrrsrtr%_remove_optionrvr<rws renable_versionzClSelect.enable_versions5577  666 22   Z !      II' ( ($*< > > > > >r!c|}|||||j|j|f|jd}|d||jdS)z- Marks a vesrion as disabled )r{disabledrqN)rZrrrsrtr%rurvr<rws rdisable_versionzClSelect.disable_versions5577  666 22   Z !  & ! ##  II' ( ($*< > > > > >r!cL|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%ris ris_version_enabledzClSelect.is_version_enableds3 8&&jj'' *G555 5r!cL|}||}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)enableddefaultrrrlr)rZrmr[r\rr'rPr%rIrRrSr]r rhpopremoverrangelenr^) r/rnr_ native_infosummary alt_versionsrXdefault_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: rXrYNzalt-php packages not foundrDz Cannot read z: z . Native used) open CONFIG_PATHstriprQr%r(r reOSErrorIOError ValueErrorrf) r/fline stripped_liner0 short_version long_version item_pathrVs rrdz"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 NFrA)rIrN optionxformrKrt)r/rrUs rr&z$ClSelect._get_default_config_handlersS &T% H H H  ( GGDMMMM GGD& ' ' ' r!cF|dkr||vrtj|dSdS)Nr)r rh)rXr_s rrrzClSelect._check_alternative$s6 h  7,#>#> 9'BB B  #>#>r!c^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_header)s4 rwwvL0A0A'ABBB \))r!cttd|}|r |ddkr|d|S)zN Removes empty lines from list and appends newline if missing c|dkS)Nrr )is rz'ClSelect._smooth_data..7s a2gr!rq)listfilterr)rYs r _smooth_datazClSelect._smooth_data3sLF--5566 tBx4'' KK    r!Tc 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 = rHenable_extentions)rrr startswithrextendrcloserrr% _get_builtinsr UnableToGetExtensionsr<)r/rrfunctionrYtraceactioncontentsno_section_contentssection in_sectionfound has_defaultsection_headerrrrbuild_ins rrszClSelect._process_ini_file=s    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-clirYr3)suffix)r%rZr]r4)r/rXr0r_rs r_get_php_binary_pathzClSelect._get_php_binary_pathtsv $*$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)rZrr\)r/r_ paths_dictrXs rget_all_php_binaries_pathsz#ClSelect.get_all_php_binaries_pathssk5577  9 9( C CD #((** E EG"&";";G"D"DJw  r!ct|j|zd}|}||S)z Retrives contents of cache file for supplied php version :param version: PHP version to read file :return: file contents r)rCACHEFILE_PATTERNrKr)r/rXroutputs r_read_php_cache_filezClSelect._read_php_cache_files: ''13 7 7   r!cdg} ||}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\wrq_z\s+)rrrr rfindrrecompilerQmatchr<lowerr+r) r/rXbuiltinsr 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)rrYs rrz)ClSelect._remove_option..sq||D'9'9#9r!)rrrrr)r/rrrYrrs ` rr|zClSelect._remove_optionsv22<@@ w<<1  '!* < <N  9999GDD E EGG Gr!ch||}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)rrrrrr) r/rrrYrroidxroptions rruzClSelect._add_or_change_options22<@@ w<<1  '!* < <NW&&  Cs|&&tAw//  T!  #"GDMM NN6 " " "  )))r!c 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_pathrrVs rrvzClSelect._write_to_filesz @Y$$A GGF]* + + + GGIIIII! @ @ @ 1)Q?? ? @s. sr!N) r NATIVE_CONFrrrrQr)DEFAULT_PHP_PATHrrr)r/valuerrr0rs rrzClSelect._load_native_contentss  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 )r4get_native_version)r/ show_versionnative_versions rrmzClSelect._compose_native_infos ?Xt'<'<'>'>> >000??  - -%3A%6%6%688%3A%6%6%68))++- -4#8#8#:#:::r!c"|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)statusrEshortfull)r,rrrCACHEFILE_NATIVE_VER_PATTERNrKrrrr print_diagrN splitlinesrgroup) r/rversion_patternrrYrVrmrrs rrzClSelect.get_native_versions1   (' '*%PQQ T6<rbrZrjroryr}rrrrdr&rrrrrsrrrrr|rurvr4rrmrr r!rrrs2K3M%0K,I6K%IM% 4#03H#H  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,;;;;r!r) __future__rrrrrrrrrclcommonr future.movesr rIclselectexceptr r clselectprintr objectrr r!rrs'&&&&&%%%%%% ''''''555555AAAAAAAA""""""VVVVVvVVVVVr!