ÿØÿà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@`sddlmZddlmZddlmZddlZddlZddlZddlmZddl Z ddl Z ddl Z ddl mZddlmZdd lmZdd lmZmZdd lmZmZdd lmZdd lmZddlmZddlm Z ddl!m"Z"ddl m#Z#mZdddddddgZ$edd/Z%edd0Z&d#Z'd$Z(d%Z)d&Z*d'Z+dd(Z-d)Z.dd*Z/d+Z0d,Z1d-Z2d.Z3dS(1i(tabsolute_import(tprint_function(tdivisionN(t namedtuple(tList(t iteritemsi(t clpassenger(tcpuserst getCPName(tdrop_privilegestClPwd(tis_no_php_binaries_on_cpanel(tClSelectExcept(t NodeManager(t PythonManager(t get_abs_rel(tOptionalRt public_htmltrubyvenvt virtualenvs .cl.selectors.cagefstwwwtnodevenvtApplicationSummarytusertversiontdoc_roott interpretert app_statustInterpreterSummaryt version_fulltenabledt installedcC`sd|krtdntjj|r<tdn|ddkr[tdn|tkrztd|ntjd|}|dkrtd ndS( Nt s#Directory should not contain spacess+Directory should be relative to user's homeit/s-Directory should not contain a trailing slashsDirectory "%s" not alloweds [-\.\w\/]+$s*Directory name contains invalid characters(t ValueErrortostpathtisabstDISABLED_DIRECTORY_NAMEStretmatchtNone(t directoryt all_valid((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctl.pytcheck_directory&s   cC`sNx)dD]!}||krtdqqW|d krAd}n|jdS( Nt#t?s./sAlias is not validt.tR!(R-R.s./(R/R0(R"tstrip(taliastc((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctl.pyt get_alias4s     cC`s|jddjddS(Nt_R!s//(treplace(tprefix((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctl.pyt get_directory?scC`s|jddjddS(NR5t__R!(R6(R*((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctl.pyt get_prefixCscC`sF|s'tj}tj|j}n|dkrBtdn|S(Ntroots8User parameter must be specified if current user is root(R#tgeteuidtpwdtgetpwuidtpw_nameR"(Rt current_euid((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctl.pytget_userGs   cC`s>|dkrtjj|Stjj|o=tjj|S(s Application is valid only if binary and app_root exists :param binary_path: path to binary in virtual environment :param app_root: path to root directory of application :return: result of checking :rtype: bool tnodejstpython(RBRC(R#R$tisdirtisfile(Rtapp_roott binary_path((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctl.pyt_verify_applicationPs c C`stjr(ddlm}|}nd}g}tj}xtD]}y=t|+t j ||j t |||WdQXWqJt jk rqJqJtk rtjt}|jd||tjttjfqJXqJW|S(s8Find and return all apps for given interpreter on serveri(t$_get_domains_docroots_from_da_binaryNs]DEBUG: user %s present in panel but doesn't exist in system. Process euid=%d. Trace: %s at %s(tdetecttis_dat"clcommon.cpapi.plugins.directadminRIR)R#R<RR R=tgetpwnamtextendt _user_applications_short_summaryR tNoSuchUserExceptiontKeyErrortloggingt getLoggert__name__terrort tracebackt format_exctstrt extract_stack(RRItdomains_docroots_datat applicationsteuidRtlogger((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctl.pytserver_applications_summary]s&       .c c`s|dk r1||kr1t||j}nd}|dkr;yE|dkreddlm}nddlm}|j|}Wntjk rdSXx\t |D]\}}yt ||\}} Wntjk rqnXt ||rt d|d|d|d |d d |d |d VqqWnxt t j|d |D]\} }|d |kryqWn|d|d} }t ||| rWtjjtjjtjj| } t d|d| d |dd |d d dVqWqWWdS(s Return generator with all applications for given user and interpreter. To increase performance, only a small part of the information about the applications is given. :param user: name of panel user :param interpreter: name of interpreter (python, ruby, etc) :param domains_docroots_data: total data about users domains :return: Generator[ApplicationSummary] RBRCi(tApplicationsManagerNRRs %s_versionRtdomainRRtuserdomains_datatbinaryR*tdocroottstarted(RBRC(R)tlisttitemstclselectnodejs.apps_managerR_tclselectpython.apps_managertget_user_config_dataR t WrongDataRRRHRRtsummaryR#R$tbasenametdirname( RRRZRaR_t config_datatapptdataRFR5tdummyRbt it_version((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctl.pyRO~s>    (*cC`s0|dkrtjS|dkr,tjSdS(s-Return default version for given interpreter RBRCN(R tdefault_versionRR)(R((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctl.pytget_default_versions     c c`s|dkr$tjdt}n-|dkrHtjdt}n txt|dD]\}}|ddk}|dkrtt|jdd}ndj |jdd }t d |d |d|d tVqbWd S(s.Return generator for interpreters all versionsRBtinstalled_interpreters_onlyRCtavailable_versionststatusRR/iiRRRN( R t get_summarytTrueRtNotImplementedErrorRRXtinttsplittjoinR(Rt interpretersRt version_infoRt major_version((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctl.pyt_iter_interpreterss    "c c`sfddlm}|}|j}x:|D]2\}}}t||dtd|j|Vq,WdS(sf Return generator with all PHP versions on server. :return: Generator[InterpreterSummary] i(tClSelectRRN(tclselectRtlist_alternativesRRytis_version_enabled(RtphptversionsRt full_versionR5((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctl.pyt_iter_php_interpreterss  c C`s|dkr5tdkr(tr(d SttS|dkrTddlm}n"|d krptt|Stg}x9|D].}|j t |j |j dt d t qW|S( s<Find and return all versions for given interpreter on serverRtcPaneltrubyi(R~RCRBRRN(RCRB(RR R)ReRtclselectruby.interpretersR~RRztappendRRRRy(RR~tit_listtit((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctl.pyt"interpreter_versions_short_summarys    ,(RRRRR(RRRR(4t __future__RRRR#R=R't collectionsRRRRVt cldetectlibRJttypingRt future.utilsRR0Rtclcommon.cpapiRRtclcommon.clpwdR R tclcommon.cpapi.plugins.cpanelR tclselectexceptR tclselectnodejs.node_managerR tclselectpython.python_managerRtutilsRRR&RRR,R4R8R:RAR)RHR^RORtRRR(((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctl.pytsF          ! 4