ÿØÿàJFIFÿþ ÿÛC       ÿÛC ÿÀÿÄÿÄ"#QrÿÄÿÄ&1!A"2qQaáÿÚ ?Øy,æ/3JæÝ¹È߲؋5êXw²±ÉyˆR”¾I0ó2—PI¾IÌÚiMö¯–þrìN&"KgX:Šíµ•nTJnLK„…@!‰-ý ùúmë;ºgµŒ&ó±hw’¯Õ@”Ü— 9ñ-ë.²1<yà‚¹ïQÐU„ہ?.’¦èûbß±©Ö«Âw*VŒ) `$‰bØÔŸ’ëXÖ-ËTÜíGÚ3ð«g Ÿ§¯—Jx„–’U/ÂÅv_s(Hÿ@TñJÑãõçn­‚!ÈgfbÓc­:él[ðQe 9ÀPLbÃãCµm[5¿ç'ªjglå‡Ûí_§Úõl-;"PkÞÞÁQâ¼_Ñ^¢SŸx?"¸¦ùY騐ÒOÈ q’`~~ÚtËU¹CڒêV  I1Áß_ÿÙ iB^c@`sddlmZddlmZddlmZddlZddlZddlZddlZddlmZddl m Z ddl m Z m Z dd lmZd efd YZdS( i(tabsolute_import(tprint_function(tdivisionN(tglob(tmapi(tClSelectExcepttBaseClSelectException(tclprinttClSelectcB`seZdZdZdZdZdZdZdZedZ edZ e d Z e d Z d d Zd ZdZdZdZdZedZdZdZdZdZedZdZd)dZdZe eZdZe eZdZ e e Z e!d)dZ"dZ#dZ$d Z%d!Z&e!d"Z'e!d#Z(d$Z)d)d%Z*d&Z+ed'Z,e!d(Z-RS(*s/etc/cl.selector/selector.confs/etc/cl.selector/defaults.cfgs /usr/bin/phps/etc/cl.selector/native.confs/etc/cl.selector/user.confs"/etc/cl.selector/php.extensions.d/s/var/lves /php%s.dats/php_native_ver.datcC`sy<dtjkr%tjjdnddlm}m}Wntk r[tdnX| r| rtdndS(Ns/usr/share/cagefsi(t!multiphp_system_default_is_ea_phptselector_modules_must_be_usedsCageFS not installed.sesystem default PHP version is alt-php. PHP Selector is disabled. Use cPanel MultiPHP manager instead.(tsystpathtappendt cagefsctlR R t ImportErrorR(R R ((sB/opt/alt/python27/lib/python2.7/site-packages/clselect/clselect.pyt%check_multiphp_system_default_version$s cC`stjjtjS(N(tosR texistsRt USER_CONF(((sB/opt/alt/python27/lib/python2.7/site-packages/clselect/clselect.pytwork_without_cagefs0stphpcC`s\||_|j|_i|_i|_t|_d|_t j |_ |j dS(N( t_itemt_get_default_config_handlert_dht_selector_contentst_native_contentstsett_hidden_extensionstNonet_native_versionRRtwithout_cagefst_load_config_files(tselftitem((sB/opt/alt/python27/lib/python2.7/site-packages/clselect/clselect.pyt__init__4s     cC`s:x3ttjj|jdD]}|j|qWdS(Ns*.cfg(RRR tjoint CONFIGS_DIRt_load_config_file(R!tfilename((sB/opt/alt/python27/lib/python2.7/site-packages/clselect/clselect.pyR ?s%cC`stj}y|j|Wn5tjk rT}tj|ddt|nXy)|jj|j ddj dWntj tj fk rnXdS(NtmessagesConfig is malformed, error: %st extensionsthide_extensionst,( t ConfigParsertSafeConfigParsertreadtErrorRtFileProcessErrortstrRtupdatetgettsplittNoSectionErrort NoOptionError(R!tfilepathtdhte((sB/opt/alt/python27/lib/python2.7/site-packages/clselect/clselect.pyR&Cs   cC`s|j}g}xbt|jD]N}y1|j|||d||d|jfWq%tk rrq%q%Xq%Wt|S(sM Returns alternatives summary as tuple :rtype: tuple tversiontdata(tget_all_alternatives_datatsortedtkeysR RtKeyErrorttuple(R!t alternativestlist_of_alternativestalt((sB/opt/alt/python27/lib/python2.7/site-packages/clselect/clselect.pytlist_alternativesRs    cC`sB|js;y|jWq;tjtjfk r7iSXn|jS(s 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 (Rt_load_alternatives_configRtConfigNotFoundtWrongConfigFormat(R!((sB/opt/alt/python27/lib/python2.7/site-packages/clselect/clselect.pyR<ds cC`sS|js|jnyi|j||6SWn tk rNtj|nXdS(s Returns selector config contents of certain version as dict. If no data loads them @param version: string, selector version @return: dict N(RRER?RtNoSuchAlternativeVersion(R!R:((sB/opt/alt/python27/lib/python2.7/site-packages/clselect/clselect.pytget_alternatives_datavs    cC`sw|j}y@|jjd|j}|||d||d|jfSWn$tjtfk rr|j|SXdS(s/ Gets default selector version tversionsR:R;N(R<RR3RR,R5R?t_compose_native_info(R!tshow_native_versionRAR:((sB/opt/alt/python27/lib/python2.7/site-packages/clselect/clselect.pyt get_versions  cC`sc|j}|j|||j|jd|j|j|f}|jdj||jdS(s/ Sets default selector version RJs N(RJ(R<t_check_alternativet_process_ini_filet DEFAULTS_PATHt_add_or_change_optionRt_write_to_fileR$(R!R:RAtdefaults_contents((sB/opt/alt/python27/lib/python2.7/site-packages/clselect/clselect.pyt set_versions cC`sc|j}|j|||j|j|j|f|jd}|jdj||jdS(s5 Removes disabled state from version tstates N(R<RNRORPRt_remove_optionRRR$(R!R:RARS((sB/opt/alt/python27/lib/python2.7/site-packages/clselect/clselect.pytenable_versions   cC`sc|j}|j|||j|j|j|f|jd}|jdj||jdS(s- Marks a vesrion as disabled RUtdisableds N(RURX(R<RNRORPRRQRRR$(R!R:RARS((sB/opt/alt/python27/lib/python2.7/site-packages/clselect/clselect.pytdisable_versions   cC`s!|jjd|j|fd S(s Method that allows you to check if some version is enabled in config. E.g. is_version_enabled('5.4') -> True :rtype: bool s%s%sRU(Rt has_optionR(R!R:((sB/opt/alt/python27/lib/python2.7/site-packages/clselect/clselect.pytis_version_enableds c C`s|j}|j|}iitd6td6d6}t|jdg}xL|D]D}||krui||R[RR3RR,R5R6R?RRHtpoptremoveR trangetlenR@( R!RLRAt native_infotsummaryt alt_versionsR:tdefault_versiontidxtv((sB/opt/alt/python27/lib/python2.7/site-packages/clselect/clselect.pyt get_summarys4         c C`s`yt|j}x|D]}|j}|dkr=qn|j\}}}}|j|krjqn||jkri|j|)Rlis (tlisttfilterR (R;((sB/opt/alt/python27/lib/python2.7/site-packages/clselect/clselect.pyt _smooth_data%scC`scg}g}g} t} t} t} |j|} yt|}x|D]}|j}|jdrt} d|krt} n| |krt} nt|dkr|j|g}n|j||| |||g} qIn| r| j|qI|j|qIW|j||| |||j Wnt t fk rTnX| rd| krdd|j dg}|j||}n| s_y|j d}Wntjk rnX|dkr|j||| dd j|g||q_|d kr=|j||j||| g||q_|j||| g||n|S( s Parses ini file by sections, calls supplied callable to modify section is question, returns file as list of strings t[s [versions]is %s = nativeRlR^tdisable_extentionss modules = R+tenable_extentions(R`R|RmRot startswithR_RdtextendR tcloseRpRqRt _get_builtinsRtUnableToGetExtensionsR$(R!R RztfunctionR;ttracetactiontcontentstno_section_contentstsectiont in_sectiontfoundt has_defaulttsection_headerRsRtR]tbuild_in((sB/opt/alt/python27/lib/python2.7/site-packages/clselect/clselect.pyRO/s\             2  ""cC`sYd|j}|j}y||d|}Wn#tk rT|jdd}nX|S(s 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 s%s-cliR;tsuffixtcli(RR<R?t_get_native_path(R!R:R"RAR ((sB/opt/alt/python27/lib/python2.7/site-packages/clselect/clselect.pyt_get_php_binary_pathfs   cC`sP|j}i|jdd6}x'|jD]}|j||| 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!RAt paths_dictR:((sB/opt/alt/python27/lib/python2.7/site-packages/clselect/clselect.pytget_all_php_binaries_pathsts cC`s0t|j|d}|j}|j|S(s Retrives contents of cache file for supplied php version :param version: PHP version to read file :return: file contents tr(RmtCACHEFILE_PATTERNR.R(R!R:Rstoutput((sB/opt/alt/python27/lib/python2.7/site-packages/clselect/clselect.pyt_read_php_cache_files  c C`sg}y|j|}Wn+ttfk rF}tj||nX|jd}tjd}||dkrz|pt| }xl|j dD][}|j |sqndj tj d|j } | |j kr|j| qqW|S(s1 Gets php compiled-in extensions s[Zends\wis t_s\s+(RRpRqRRtfindtretcompileRdR4tmatchR$tlowerRR ( R!R:tbuiltinsRR9t zend_indextmodule_patterntstripped_outputtexttmodule((sB/opt/alt/python27/lib/python2.7/site-packages/clselect/clselect.pyRs"!c`sZ|j|}t|dks1||dkr5|S|jttfd|S(s Adds 'modules' option to section or extends it @param section_info: tuple (item and version) @param section: list @param data: string @return: list ic`s|j S(N(R(R}(R;(sB/opt/alt/python27/lib/python2.7/site-packages/clselect/clselect.pyR~Rl(R|RdRRR(R!RzRR;RR((R;sB/opt/alt/python27/lib/python2.7/site-packages/clselect/clselect.pyRVs "c C`s|j|}t|dks1||dkr5|Sd}x;tt|D]'}||j|drN|}PqNqNWd|}|r|||(?P\d+\.\d+)\.\d+)RttexttERRORtstatusR(tshorttfull(RRRRmtCACHEFILE_NATIVE_VER_PATTERNR.RRpRqRt print_diagR1Rt splitlinesRtgroup( R!Rtversion_patternRsR;R9RttmRR((sB/opt/alt/python27/lib/python2.7/site-packages/clselect/clselect.pyRs$  'N(.t__name__t __module__RnRPRRRR%t CACHEFILE_DIRRRt staticmethodRRR#R R&RDR<RIR`RMRTRWRYR[RkRERRRNR|RR_RORRRRRVRQRRRRRKR(((sB/opt/alt/python27/lib/python2.7/site-packages/clselect/clselect.pyRsV             ! $      7        (t __future__RRRRRR,R RRRtclselectexceptRRt clselectprintRtobjectR(((sB/opt/alt/python27/lib/python2.7/site-packages/clselect/clselect.pyts