ÿØÿà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@`sTddlmZddlmZddlmZddlmZddlmZddlm Z m Z ddl m Z m Z ddlmZmZmZd d lmZd d lmZd d lmZmZdd lmZmZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dS(i(tprint_function(tdivision(tabsolute_import(t defaultdict(t iteritems(tget_suEXEC_statustget_suPHP_status(tCageFstCageFsException(tget_domains_php_infotget_system_php_infot getCPNamei(t ClUserSelect(tClSelect(t"interpreter_versions_short_summarytserver_applications_summary(tOptionaltDictcC`s t|S(sd Return list of InterpreterSummary objects :rtype: list[clselectctl.InterpreterSummary] (R(t interpreter((sL/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectstatistics.pyt_iter_versionsscC`s t|S(sd Return list of ApplicationSummary objects :rtype: list[clselectctl.ApplicationSummary] (R(R((sL/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectstatistics.pytiter_server_applications#scC`s*t|}|dk r&d|DSdS(NcS`s:i|]0}i|jd6|jd6|jd6|jqS(t full_versiontenabledt installed(t version_fullRRtversion(t.0tit((sL/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectstatistics.pys 0s (RtNone(Rtinterpreters_versions((sL/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectstatistics.pytget_versions_statistics+s  cC`s7|ddhkp6|ddhkr-tp6|dkS(st Handler is supported in the following cases: - handler is suphp or lsapi with suexec or suphp (check for last two is in the _get_php_selector_usage method) - handler is cgi or fcgi (only with suexec, otherwise scripts do not run in cagefs) - handler is None (possible when php package was removed and we can`t detect handler, it is set to None) tsuphptlsapitcgitfcgiN(RR(thandler((sL/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectstatistics.pyt!_is_acceptable_php_handler_cpanel8scC`st}td}tt}xXt|D]J\}}|d|krQq/nt|dr/||dj|q/q/Wt|S(s Return domains that are using php selector. 1. Skip domains whose version is not system default (php selector replaces only system default version binary with symlink to alt-php) 2. Take only domains that use supported handlers. tdefault_version_idtphp_version_idt handler_typetusername(R R RtsetRR$taddtdict(tvhosts_php_infotdefault_php_idtphpselector_domainstdomaint domain_info((sL/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectstatistics.pyt$_get_php_selector_domains_for_cpanelDs   cC`sd}d}t}tt}xRt|D]D\}}|d|kr1||dr1||dj|q1q1Wt|S(s Return domains that meet panel specific requirements which will allow php selector to work when the common requirements are met. R!tfastcgicS`s d}d|kr||kStS(Nsx-httpd-lsphp-customtlsphp(tTrue(t handler_idtlsphp_vendor_version((sL/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectstatistics.pytis_allowed_version`s  R'R&R((R!R2(R RR)RR*R+(tallowed_handlersR7tdomains_php_infotresultR/tinfo((sL/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectstatistics.pyt#_get_php_selector_domains_for_pleskXs   cC`sjd}t}tt}xBt|D]4\}}|d|kr(||dj|q(q(Wt|S(s Return domains that meet panel specific requirements which will allow php selector to work when the common requirements are met. R2RR!R3R'R((R2RR!R3(R RR)RR*R+(R8R9R:R/tphp_info((sL/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectstatistics.pyt _get_php_selector_domains_for_daps  cC`sJt}|dkrtS|dkr/tS|dkrBtSdSdS(s Detect current control panel and get list of php selector domains for it Return None if control panel is not supported tcPanelt DirectAdmintPleskN(R R1R>R<R(tpanel((sL/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectstatistics.pyt!_get_php_vhosts_for_current_panel~s    cC`st}|jsdSy|jWntk r;dSXtttfsXdSt}|dkrqdSt }t t }t t }xjt |D]\\}}|j |sqn|j|dtd}||j|||j|qWi|d6|d6S(s+Get users and domains that use php selectortshow_native_versionitdomains_by_php_versiontusers_by_php_versionN(Rtis_cagefs_presentRt _load_infoRtanyRRRCR RR)Rtget_user_statust get_versiontFalsetupdateR*(tcagefst php_vhoststphpRERFtusert user_domainsR((sL/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectstatistics.pytget_php_selector_usages0        cC`s3t}|jdt}|dkr+|S|dS(s7 Safely get native version, or None if not set tverboseiN(t ClSelectPhptget_native_versionRLR(RPtv((sL/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectstatistics.pytget_native_version_safes   cC`stjrdSdS(s= Get state of PHP selector: without CageFS or normal twithout_cagefstnormal(RUtwork_without_cagefs(((sL/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectstatistics.pytget_mode_of_php_selectorscC`stjdS(s- Get default version of PHP selector i(RURK(((sL/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectstatistics.pytget_default_php_versionsN()t __future__RRRt collectionsRt future.utilsRt cldetectlibRRtcllimitsRRtclcommon.cpapiR R R t cluserselectR tclselectR RUt clselectctlRRttypingRRRRRR$R1R<R>RCRSRXR\R](((sL/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectstatistics.pyt s.       &