ÿØÿà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@`sddlmZddlmZddlmZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlmZddlmZddlZddlZddlZddlZddlZddlZddlZddlmZddlmZdd l m!Z!m"Z"dd l#m$Z$m%Z%m&Z&dd l'm(Z(dd lm)Z)dd lm*Z*ddlm+Z+m,Z,m-Z-ddl.m/Z/m0Z0m1Z1m2Z2ddlm3Z3ddl4m5Z5m6Z6ddlm7Z8ddl9m:Z:ddl;m<Z<ddl=m>Z>m?Z?ddl@mAZAddlBmCZDddlEmCZFddlGmHZHmIZImJZJmKZKmLZLmMZMddlNmOZOddlPmQZQmRZRdefdYZ7idd6ZSdeTfd YZUdS(!i(tprint_function(tdivision(tabsolute_importN(tSet(t iteritems(tFormattedException(tresolve_username_and_doc_root(tCP_NAMEtdocroot(tNoDomaint NotSupportedt IncorrectData(t exec_utility(t clselectctl(t clpassenger(t ClUserSelecttClSelectt ClExtSelect(tAPP_STARTED_CONSTtENABLED_STATUStDISABLED_STATUStBaseSelectorError(tvalidate_env_vars(tformat_summarytAPI_1(tClSelectExcept(tNodeJSConfigError(t NodeManager(tPythonAppFormatVersiontget_venv_rel_path(t PythonManager(t Environment(tmkdir_pt file_readt file_writetget_using_realpath_keyst get_abs_reltdelete_using_realpath_keys(tget_perm(t_set_ui_configtUIConfigExceptionRcB`seZRS((t__name__t __module__(((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyRFstoktstatustCloudlinuxSelectorLibcB`sPeZdZdZedFdFdZedZedZedFdZ edFdFdZ edZ edFdZ d Z ed Zd Zd Zed ZedZdZdFdZedZdZedZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#d Z$d!Z%d"Z&d#Z'dFdFdFdFdFdFdFd$Z(ed%Z)dFd&Z*dFd'Z+ed(Z,dFdFe-d)Z.dFdFe-dFdGd*Z/d+Z0d,Z1d-Z2d.Z3ed/Z4d0Z5ed1Z6d2Z7d3Z8ed4Z9dFd5Z:dFdFd6Z;d7Z<ed8Z=dFe-d9Z>d:Z?d;Z@d<ZAd=ZBdFd>ZCd?ZDd@ZEdAZFedBZGedCZHdDZIdEZJRS(HcC`s||_t|_d|_d|_d|_d|_d|_d|_d|_ d|_ |jdfg}x|D]\}}|j|j kr|d d krqsnt j j |sst|_|jd |d d i|d|d 6|_PqsqsWd|_d|_d|_d|_|j|jkrrd dlm}||_t|_tj|_tj|_n|j|jkrd dlm}||_t|_tj|_tj|_n1|j|j krd dl m!}||_ndS(Ns/usr/bin/selectorctls/usr/sbin/cagefsctls+/usr/share/l.v.e-manager/utils/dynamicui.pys/usr/sbin/cloudlinux-selectortnodejstpythontrubytphptcagefss>http://docs.cloudlinux.com/index.html?cagefs_installation.htmlisplease install or reinstall %stlinki(tApplicationsManager(t PhpManager(R2s>http://docs.cloudlinux.com/index.html?cagefs_installation.html("t interpretertTruetselector_is_readyt_SELECTORCTL_UTILITYt_CAGEFSCTL_UTILITYtDYNAMIC_UI_CTL_CMDtCLOUDLINUX_SELECTOR_UTILITYtNODEJS_INTERPRETERtPYTHON_INTERPRETERtRUBY_INTERPRETERtPHP_INTERPRETERtostpathtexiststFalset _return_errortselector_error_reasontNonetselector_managert apps_managertselector_user_libtselector_old_libt$clselect.clselectnodejs.apps_managerR4Rtclselecttclselectnodejsusertclselectctlnodejsusert$clselect.clselectpython.apps_managerRtclselectpythonusertclselectctlpythont clselect.clselectphp.php_managerR5(tselfR6t utilitiesRBtpackageR4R5((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyt__init__NsP           "           cC`s1|jj||}|j||\}}|S(s7Get doc_root from application config or raise exception(RItget_app_domaint$safely_resolve_username_and_doc_root(RTtusernametapp_roottdomaint_tdoc_root((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pytsafely_resolve_doc_root_for_appscC`sytd|d|\}}Wntk rlti|d k rGdndd6i|d6|d6d6njtk rtidd6itd6d6n9tk rtid d6i|d6|d6d6nX||fS( s8 Safely resolve username and doc_root by domain, or resolve document root by username, or resolve document root and username by effective uid :param user: str -> name of unix user :param domain: str -> domain of panel user :return: tuple -> user, doc_root tuserR\sNo such domain: %(domain)ssNo such user: %(user)stmessagetcontexts+Nodejs selector not supported for %(panel)stpanels3Domain %(domain)s is not owned by the user %(user)sN(RR RRGR RR (R`R\t result_usertresult_doc_root((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyRYs2    cC`st}t\}}|dkr*t}n{t|tsBt}nc|ddkrk|ddkrkt}n:|dkr|dkrt}n|ddkrt}n|S(s Check whether selector should be run through "su - user" :param opts: dict of parsed cli params :return: True if should be run through su or False if not s--users--domainis --interpreterR1N(R7R&RGRDt isinstancetdict(toptstresultteuidtegid((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pytshould_be_runned_as_users       cC`s0|ddko/|ddk o/tjdkS(Ns --interpreterR1s--useri(RGRAtgeteuid(Rh((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pytshould_run_user_without_cagefsscC`stj|}|S(s Resolves user eigher with passed username or with getting current user ID :param user: str or None -> username to be resolved :return: obj -> pwd user object (tpwdtgetpwnam(R`tuserdata((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyt_get_user_pwd_datascC`s9|dkr5|dkr5tidd6id6ndS(s Check if user and domain are None :param user: name of unix user :param domain: domain of panel user :return: None sBUser or domain parameter must be specified if current user is rootRaRbN(RGR(R`R\((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pytuser_and_domain_checkers cK`s7id|d6}t|dkr3|j|n|S(Ns ERROR: %sR,i(tlentupdate(Ritkwargsterr((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyREscC`s5idd6|d6}|r1|ji|d6n|S(s Construct error dict in one place :param result: error string :return: dict with 'status':'error' and error message terrorR,Ritdetails(Ru(RiRyRw((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyt_return_with_status_errors  cC`s|ttfkr(|jdj|Sy|tk|j_Wntk r]}|j|SX|j|jkrii|tkd6d6}yt |t SWqt k rqXn|j t S(s Set CL selector status in it's config :param status: set status of selector :return: error or ok message sKUnknown selector status provided: "{}". Can be only 'enabled' or 'disabled't hidePythonAppt uiSettings( RRREtformatRHtselector_enabledRR6R>R'tOK_RESR(t update_ui(RTR,tet config_dict((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyt_change_selector_statuss"    cC`s*itd6}tjr&t|d owner of application :param app_root: str -> application directory :param script_name: str -> name of script :param script_args: list of str -> arguments for the script :return: dict tnpmR/s run-scripts--N( RR6R=RItget_binary_pathR>tNotImplementedErrortappendRGtextendt_run_interpreter( RTR`R[t script_namet script_argst user_hometinterpreter_pathtcmdRi((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyt run_scriptIs$       c C`stjd|dtjj||dtjdtj}y|j\}}Wn;tk r}tidd6i|d6|d6d6nXd j |j |j |j }it j |d 6}|jid d 6|S( s Run interpreter in users environment :param cmd: list -> command to execute :param user_home: -> user home directory :param app_root: -> app path :return: dict targstcwdtstdouttstderrs6run-script call: `%(args)s` failed with error: %(err)sRaRwRbs%returncode: {} stdout: {} stderr: {} tdatatsuccessR,(t subprocesstPopenRARBtjointPIPEt communicatetOSErrorRR}t returncodetstriptbase64t b64encodeRu( RRR[tpRRRt output_stringRi((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyRfs  cC`s,|j|j|jfkr(|jjSdS(N(R6R=R@RHR(RT((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pytget_fullscC`sotj}tj}x*t|D]\}}||cd7RR@R(RT((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyRs   cC`s |jj S(N(RHR~(RT((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pytphp_selector_is_disabledscC`s |jjS(N(RHR~(RT((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pytphp_selector_is_enabledscC`s|j|jkrtSy<dtjkr;tjjdnddlm}m}Wnt k rftSX|r|j r|}|ry!|d}|j dst SWqt k rqXqntS(s Returns True when MultiPHP system default PHP version is alt-php and PHP Selector is NOT disabled For details please see LVEMAN-1170 s/usr/share/cagefsi(tis_ea4_enabledtread_cpanel_ea4_php_conftdefaultsea-php(R6R@RDtsysRBRt cagefsctlRRt ImportErrorRt startswithR7R(RTRRtconft default_php((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pytcheck_multiphp_system_defaults$     c C`s|j|j|jfkrx`t|D]R\}}y|j||}Wntk ri}|j|SX|tkr(|Sq(WtS|j}y|d}Wn+t k r|jd|j |jfSXd|D}t |j |r)|jddj t |j ||j |jfSd} g} xet|D]W\}} | rst|jjt|nt|jjt|| d7} qBW| t|krtS| dkridj| t|| d 6S|jd j| SdS( Ntavailable_versionss:corrupted answer from %s --json --summary --interpreter %scS`sh|]}|dqS(R((t.0tx((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pys s sWinvalid alternative versions (%s), see %s --summary --interpreter %s for valid versionss, iis>WARNING: only {} of {} commands was successful. Errors was: {}R,s&All commands were failedErrors was: {}(R6R=R>Rtset_version_statusRRERRRR9tsettkeysRRtenable_versiontstrtdisable_versionRtR}( RTtversionsRtenable_disableRiRRtalternatives_listtalternatives_versionsRt errors_listt to_enable((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pytset_supported_versionssH    "  cC`sy&|jdk r%|jj|nWnftjjjk rctidd6i|d6d6n,tjjtfk r}|j |j SXt S(NsNo such php version: %(ver)sRatverRb( RHRGtswitch_default_versionRMtclselectexceptRtNoSuchAlternativeVersiontBaseClSelectExceptionRRzRaR(RTRR((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pytset_default_versions cC`s3|r|jj|tn|jj|ttS(s Disable or enable version of selector :param target_version_status: disable or enable version of interpreter :param version: version of interpreter :return: OK_RES (RHRRRR(RTttarget_version_statusR((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyR scC`sy)|j|jkr(|jj|nWn`tjjjk rftidd6i|d6d6n&tjjk r}|j |j SXt S(NsNo such php version: %(ver)sRaRRb( R6R@RHtswitch_current_versionRMRRRRRzRaR(RTRR((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pytset_current_version/s cC`si}y+|j|jkr0|jj|}nWn`tjjjk rntidd6i|d6d6n&tjjk r}|j |j SX|S(NsNo such php version: %(ver)sRaRRb( R6R@RHtreset_extensionsRMRRRRRzRa(RTRt extensionsR((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyR;s cC`s2|j|j|j|jfkr.|j|SdS(N(R6R=R>R@R(RTR,((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pytset_selector_statusHs!cC`sttjs$tjs$tjrpt|jdgdt\}}}|dkrp|jdj||SndS(Ns--sync-conf=allRis"Can not sync UI with reason: {} {}( tdetectt is_cpaneltis_plesktis_daR R;R7RER}RG(RTtretcodetoutRw((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyRLs$! cC`s~tj}|j|jkrzy/|jj||}|rL|j|nWn&tjj k ru}|j |j SX|SdS(N( RtcopyR6R@RHtset_extensionsRuRMRRRzRa(RTRRRiRR((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyRUs cC`sY|j|jkrUy|jj||WqUtjjk rQ}|j|jSXnt S(N( R6R@RHt set_optionsRMRRRzRaR(RTtoptionsRR((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyR`s cC`s1|d kr|jjdd}|d ks<|dkrWtdj|jn|j|jkrtjd|}|stidd6i|d6d6n|j d S|Snt |t t fr|j|jkrt t |St |Sn|d kr-tid d6i|d6d6n|S( s3 Attempts to get or verify version to be passed to external program Currently supported version is one digit (6 or 8). If version is None, return a default version :param version: str or None -> version to be verified or found :return: str -> digit as string Rts{} default version not defineds(?P\d+)s#Incorrect selector version: %(ver)sRaRRbRtnativesUnsupported version: %(ver)sN(RGRRRR}R6R=tretmatchtgroupRftinttfloatR(RTRRtm((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pytresolve_versionhs&      c C`s|j|||j|}|d k rCttj|}n|j||\}} y|j|jkr|j j ||||d| d|d|d|d| d|j d| n|j|j krt jj ||||d| n^|j|jkrK|j j |||d|d| d |d|d|d|d|j d| nWn2t jjk r} |jd | jd | jSXtS( s Creates application for specified user, interpreter and version If user is None we hope that the external application resolves a user Currently NodeJS supported only :param domain: str -> domain of the application :param app_root: str -> app path relative to user home :param app_uri: str -> URI path of the application :param version: str or None -> version of the interpreter :param user: str or None -> username of user who owns the app :param app_mode: str or None -> application mode (development or production) :param startup_file: str or None -> main application file :param env_vars: json_string or None -> enviroment variables for application :param entry_point: Application entry point (used only for python interpreter). :param passenger_log_file: Passenger log filename :return: dict R^tenv_varst startup_filet domain_namet entry_pointRItpassenger_log_fileRtapp_modeRiRyN(RsRRGRRRRYR6R>RKtcreateRIR?RMtclselectctlrubyR=RRRzRaRyR( RTR[tapp_uriRR`R\RRRRRR^R((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyt create_apps*   " cC`sRtjj|j|}tjj|sNtidd6i|d6d6n|S(s Resolve app root to absolute path and checks if it exists :param app_root: str -> relative a user homedir app path :param userdata: obj -> pwd user object :return: str -> absolute path to app sNo such application: %(app)sRatappRb(RARBRRtisdirR(R[Rqtapp_path((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyt_get_application_paths  c C`st}|j|d|j|}|j||}tjj||}tjj|st idd6i|d6d6nyFt |0}|j } |j it j| d6WdQX|SWn)tk r} |jt| ddSXdS( s  Reads file and returns its content as Base64 string :param app_root: str -> path to app relative to user home :param user: str -> username to resolve app path :param config_path: str -> file to be read (relative to app path) :return: dict s&Configuration file not found: %(path)sRaRBRbRNtstrerrorR(RRsRGRrR RARBRRCRtopentreadRuRRt ExceptionRztgetattr( RTR[t config_pathR`RiRqR tfull_config_pathtfRR((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pytread_app_configs" #c C`s|j|d|j|}|j||}tjj||}y6t|d}|jt j |WdQXt SWn)t k r} |j t| ddSXdS(s Saves data passed as Base64 string to specified file :param content: data for saving in app's config :param app_root: str -> path to app relative to user home :param user: str -> username to resolve app path :param config_path: str -> file to be read (relative to app path) :param content: str -> Base64-encoded string :return: dict twNR R(RsRGRrR RARBRR twriteRt b64decodeRRRzR( RTR[RtcontentR`RqR RRR((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pytsave_app_configs cC`s`t|}|dk r.|jd|gn.|dk rP|jd|gn td|S(Ns--domains--usersBUser or domain parameter must be specified if current user is root(tlistRGRR(R`R\Rt result_args((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyt_add_user_or_domains    cC`s|j|||j|jkrItidd6i|jd6d6ny+x$|D]}|jj|||qSWWn&tjjk r}|j |j SXt SdS(sn Uninstall described modules for user's webapp :param app_root: directory with webapp :param modules: comma-separated list of modules to uninstall :param user: name of unix user :param domain: domain of user :param skip_web_check: skip check web application after changing its properties :return: None sJUninstall command is available only for python interpreter, not %(interp)sRatinterpRbN( RsR6R>RRKt uninstallRMRRRzRaR(RTR[tmodulesR`R\tskip_web_checktmoduleR((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pytuninstall_moduless  c C`sl|j|||j|jkrxy&|jj||d|d|jWn&tjjk rp}|j |j SXt Sn|j|j krDy|rx}|D].}|jj|||dd|d|jqWnD|r|jj||d|d|d|jnd} |j | SWn&tjjk r<}|j |j SXt Sn$tidd6i|jd6d6dS( s Install described modules for user's webapp :type domain: domain of user :param user: name of unix user :param app_root: directory with webapp :param skip_web_check: skip check web application after change it's properties :param spec_file: file containing modules and their versions to install :param modules: list of installed modules :return: None R RIs9Please, specify modules or requirements file with modulessUnknown interpreter: %(interp)sRaRRbN(RsR6R=RKtinstallRIRMRRRzRaRR>RGR( RTR[R`R\R t spec_fileRRR!Rw((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pytinstall_moduless4  cC`s|j|d y|j|jkr;tjj||ny|j||}Wn5tk rt j idd6i|d6d6nX|j|j |j fkr|j j||d|d|jn't jidd6i|jd6d6Wn&tjjk r}|j|jSXtS( s Destroy specified application root directory and user name :param app_root: Application directory :param user: name of unix user :return: dict s[No such application or it's broken. Unable to find app-root folder by this path %(app_root)RaR[RbR^RIsUnknown interpreter: %(interp)RN(RsRGR6R?RMRtdestroyR_t TypeErrortClSelectExceptionst WrongDataR=R>RKRItInterpreterErrorRRRzRaR(RTR[R`R^R((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyt destroy_appEs(    cC`s|j|dy{|j||}|j|j|jfkr_|jj||||jn't j idd6i|jd6d6t SWn&t j jk r}|j|jSXdS(s Start specified application root directory and user name :param app_root: Application directory :param username: name of unix user :return: dict sUnknown interpreter: %(interp)RaRRbN(RsRGR_R6R=R>RKtstartRIR(R*RRMRRRzRa(RTR[RZR^R((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyt start_appgs cC`s|j|dy|j||}|j|jkrV|jj||||jnX|j|jkr|jj||||jn't j idd6i|jd6d6t SWn&t j jk r}|j|jSXdS(s Destroy specified application root directory and user name :param app_root: Application directory :param username: name of unix user :return: dict sUnknown interpreter: %(interp)RaRRbN(RsRGR_R6R=RKtrestartRIR>R(R*RRMRRRzRa(RTR[RZR^R((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyt restart_app|s cC`s|j|dy|j||}|j|jkrV|jj||||jnX|j|jkr|jj||||jn't j idd6i|jd6d6t SWn&t j jk r}|j|jSXdS(s Start specified application root directory and user name :param app_root: Application directory :param user: name of unix user :return: dict sUnknown interpreter: %(interp)RaRRbN(RsRGR_R6R=RKtstopRIR>R(R*RRMRRRzRa(RTR[R`R^R((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pytstop_apps c C`s d|d}d|d}xtjtjj|dddD]}tjj|sAy_t|}||ks||kr|j||}|j||} t|| dnWqtk rt j \} } } t j j t tj| qXqAqAWdS(sO Replace old prompt and env_var in binaries in new environment t(t:t*tbinRN(tglobRARBRR R!treplaceR"tIOErrorRtexc_infoRRRt tracebacktprint_tb( tnew_envtold_envtnew_reltold_relt old_promptt new_prompttactivatet old_activatet _new_activatet new_activateR]t traceback_((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyt6_replace_old_env_and_prompt_in_binaries_in_environments+  cC`syt|||}tj|j}t|dd}ii|jjd6|jj|||d6|dd6|dd6|d6dj||dd gd 6dj||gd 6|dgd 6|6}|SWnt k riSXd S(s Retrieve application info from user's applications config. Analog of function clpassenger.summary :param username: User name :param app_config_dict_full: Full user's application config. :param app_root: Application root :return: Dictionary with application info Example: { 'binary': '/home/cltest1/virtualenv/new_app_root/2.7/bin/python', # + 'domain': 'cltest1.com', # + 'alias': 'app1', # + 'htaccess': '/home/cltest1/public_html/app1/.htaccess', # + 'interpreter': 'python', # + 'directory': '/home/cltest1/new_app_root', # + 'docroot': '/home/cltest1/public_html', # + 'domains': ['cltest1.com'] } R\iR6tbinaryRtaliasRt/s .htaccessthtaccesst directorytdomainsN( R#RoRpRRRIt INTERPRETERRRR(RTRZtapp_config_dict_fullR[tapp_config_dictRR^t app_info_dict((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pytget_app_summarys"    cC`sytjj|s/t|tj||nFx6tj|D]%}tjtjj|||q?Wtj |dS(s Move all items from old directory of application to new directory :param old_directory: full real path to old directory of applicaton :param new_directory: full real path to new directory of applicaton N( RARBRCR trenametlistdirtshutiltmoveRtrmdir(t old_directoryt new_directoryR((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyt_move_app_from_old_dir_to_news  #c C`sS|jj|}yt|||}Wn$tk rNtjd|nXt||\}}t||\}} ytj| Wn%t k r} tj | j nX|j ||| } yt|| | Wntk rnXtj ||j |||} yt||| } Wn$tk rOtj d|nX| d}| d}|jj||d| |j}|j|jkrt||\}}t||\}}t|t||d|d\}}nx|j|jkr\t|tjj|jjj|\}}t|tjj|jjj| \}}n ttjj|d}tjj|d}tjj|}tjj|stj|ntj |||j!|||j|jkr|j"||| |n|j|jkr8t||\}}n3|j|jkrb|jj#||}n t|jjj$|||}|jj%}t|||d}|t&kr"t'j(||||j)d d }t'j+||||j|d |d |d d |t'j,||nt-||||||<|jj.||d S( s Move user's application from directory to new_directory :param user: application owner. unix like user name :param old_directory: current directory with application :param new_directory: new directory for application :return: None s8No such application (or application not configured) "%s"RRIt app_summaryRiRt app_statusRR^RN(/RItget_user_config_dataR#RR(tNoSuchApplicationR$R tcheck_directoryt ValueErrorR)RaRRt AppRootBusyRKt_get_environmenttnameR6R>RR=RARBRRJt environmentstDEFAULT_PREFIXRtdirnameRCtmakedirsRURVRZRGt _get_prefixRRHRRt unconfigureRRGt configureR.R%twrite_full_user_config_data(RTR`RXRYt full_configt app_configtold_absR?tnew_absR>Rtnew_user_summarytold_user_summarytold_user_app_summaryR^RItenv_nameRtrel_venvt_old_envR]t_new_envR=R<t new_env_dirtprefixt environmentRHR\tpassenger_log_file_to_set((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyt _relocates       (!   !  cC`syc|j|j|jfkr4|j|||n.|j|jkrbtjj|||dnWn&tj j k r}|j |j SXt S(s= Call selectorctl to relocate application from old_app_root to new_app_root :param user: application owner :param old_app_root: current application directory (current application name) :param new_app_root: new application directory (new application name) :return: json N(R6R>R=R{R?RMRtrelocateRGRRRzRaR(RTR`t old_app_roott new_app_rootR((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyR|ks cC`sd}tjj|||}tjj|||}tjj|tjj|kr^dStjj|}tjj|stj|ntj||dS(s :param old_doc_root: path to old doc root of application :param old_alias: old alias (uri) of application :param new_doc_root: path to new doc root of application :param new_alias: new alias (uri) of application :return: None s .htaccessN( RARBRtrealpathRfR RgRUR(t old_doc_roott old_aliast new_doc_roott new_aliasRKtold_htaccess_filetnew_htaccess_filetnew_htaccess_path((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyt_transit_htaccess_files cC`s |jj|}yt|||}Wn)tk rStjdj|nX|j|||}yt|||} Wn)tk rtjdj|nX| d} | d} |dkr| n t j |} |j j ||d||} | jj}||dtkr||jdd}tj||| |j|tdd|d |d d|tj||| | d | d |tj||n+|dkr| }n|j| | || | |d <|dk r||d R=RR?RMRRRRRRzRaR(RTR`R[t new_app_uriRRR]R((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyRs    cC`std}|r9y|j|}Wq9tjk r5q9Xn|jj||j||dkrptjdndS(s Install nodejs extensions to new nodejs environment and change symlink //node_modules to new environment. Raise exception `WebAppError` if npm will return non-zero code is<Module installation has been failed. Please, check npm logs.N(textension_install_single_callR(tFileProcessErrorRKt_create_symlink_to_node_modulesRBt WebAppError(RTR`R[R<told_extensionst npm_ret_code((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyt_relocate_nodejs_extensionss cC`st|j}x:||D].}y|j|Wqtjk rJqXqWx:||D].}y|j|WqZtjk rqZXqZWdS(s Install python extensions to new python environment. They are equivalent to extensions from old environment. Remove python extensions which not existing in old environment from new environment N(RRtextension_uninstallR(tExternalProgramFailedtextension_install(R<Rtnew_extensionst extension((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyt_relocate_python_extensionss c `sjjytWn$tk rNtjdnXjj}si|jj |j 6Sjj }j t |j}jjkrj||n+jjkrj||ntj}t|} | d|jjjj| \} f d} |sy#jjd| dd| Wqtjk r} tjd| qXn| dS( s Set current interpreter version for the application :param user: application owner. unix like user name :param directory: app_root - main directory with user application :param version: new version of python interpreter or None if we get current :param skip_web_check: skip check web application after change it's properties :return: None s8No such application (or application not configured) "%s"Rc `stjjdd}tjjdddd|tjdj<jjdS(NRR^Rs %s_version( RRiRRGRjR6R.RIRk(Rz( RIRmRHRLR^RlRTR`R(sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pytaction?s! R\RIRs,An error occured during changing version. %sN(RIR]R#RR(R^RKRbR6tas_dictRct_create_environmentt_ensure_version_enabledRRR>RR=RRtsummaryRHt_get_info_about_webapptcheck_response_from_webappR( RTR`RLRR told_environmenttnew_environmenttinstalled_extensionstuser_summary_dataR[t app_domainRRw(( RIRmRHRLR^RlRTR`RsG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyt_change_versions@   '   cC`sy|j|j|jfkr'tn|j|jkrz|jj||jdtj}|tjkrzidd6Sn|jj ||t kr|j |||d|n|j |||t SWn&tjjk r}|j|jSXdS(sx Call selectorctl to change current interpreter version to new_version for application :param user: application owner :param app_root: application directory (application name) :param new_version: new nodejs interpreter version :param skip_web_check: skip check web application after change it's properties :return: json t app_versionsThis application was created by too old version of python selector and we cannot change version without migration to the new application format. To do that you can use `cloudlinux-selector migrate` command or just click button in web UI.R,R N(R6R=R>RRItget_app_configRRtLEGACYtget_app_statusRRt_change_version_for_stopped_appRRMRRRzRa(RTR`R[t new_versionR RR((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pytchange_versionXs   cC`sv|j|jkrr|j||}y|jj||||Wqrtk rn}tjdj|qrXndS(NsRUnable to set environment variables in htaccess file for the application.Error: {}( R6R>R_RItadd_env_vars_for_htaccessRR(RR}(RTR`R[RR^Rw((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pytset_variables_for_litespeed|sc  C`s|jj|} yt||| } Wn$tk rNtjd|nX|j|jkr|dk r| d|kr| dt j krtj dn|dk r|| dRGRRRRRKt_get_full_path_to_startup_filet setup_wsgiRRRbRHt _unconfigureRjR.RkR(RTR`RLRRRRRRRltapp_config_datatstartup_file_full_patht user_summarytenvtuser_app_summaryt htaccess_pathR^RIRH((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyt_set_variablessp           !      !        ! c C`s|dk rLyttj|} WqRttfk rH|jdSXnd} y|j|j|j fkr|j j ||t kr|j |||| ||||n"|j|||| ||||tSWn&tjjk r} |j| jSXdS(sk Call selectorctl to set variables for application :param config_files: names of config files (such as requirements.txt or etc) (only for python) :param entry_point: the specified entrypoint for application (only for python) :param user: application owner :param app_root: application directory (application name) :param app_mode: application mode :param env_vars: json_string with environment variables for application :param startup_file: main file for application :param passenger_log_file: Passenger log filename :return: json s/wrong json format for environment variable listN(RGRRRR'R`RzR6R=R>RIRRRt_set_variables_for_stopped_appRRMRRRa( RTR`R[RRRRRRtenv_dictR((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyt set_variabless    cC`sIy|jj|}|SWn(tk rD}i|jd6|jd6SXdS(s Retrieves info about all installed interpreters and user(s) applictions :param user: User name for read applictions. If None all users will be processed :return: Dict with info RiRbN(RItget_applications_users_infoRRaRb(RTR`t result_dictR((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pytget_apps_users_infos cC`s1|jj|s-tjj||dndS(s Check whether particular interpreter version is enabled and raises exception if not :param username: user to include in exception :param new_version: new interpreter version sversion is not enabledN(RHtis_version_enabledRMRtUnableToSetAlternative(RTRRZ((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyRsc C`s|j|||jj||}|jj|||d}t|j}|jj|||d}x<|D]4}y|j|Wqtt j j j k rqtXqtW|jj |} || |d|j<|jj|| dS(s Changes version for stopped application :param username: application owner :param app_root: application directory (application name) :param new_version: new nodejs interpreter version :return: None s %s_versionN(RRItget_interpreter_version_for_appRKRRGRRRRMRRRR]R6Rk( RTRZR[Rt old_versionRRRRRm((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyRs  c C`s|jj|} |r)|| |dRRRRRIt$import_legacy_applications_to_configRRzRa(RTR((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pytrun_import_applicationsos   cC`s8|j|jkr!tdn|jj||tS(s_ Convert applications created in older selector versions to new format s/Migration is only available for python selector(R6R>RRItmigrate_applicationR(RTR`R[((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pytrun_migrate_applicationsN((KR)R*RWR_t staticmethodRGRYRlRnRrRsRERzRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRDR"R%R+R-R/R1RGRRRZR{R|RRRRRRRRRRRRRRRRRR(((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyR-Ms 2 0             ,    !+   , "    ' r  5 C $ \ "  !  (Vt __future__RRRRoRRURRRRARRR:R6ttypingRt future.utilsRt cldetectlibRtclselect.clselectctlnodejsuserRMtclselect.clselectexcepttclselect.clselectctlpythontclselect.clselectctlrubytclselect.clselectpythonusertclselect.clselectnodejsusertclcommon.clexceptionRtclcommon.clpwdRtclcommon.cpapiRRtclcommon.cpapi.cpapiexceptionsR R R t cllimits.libR R RRRRtclselect.baseclselectRRRRRtclselect.clselectctlphpRRRR(tclselect.clselectnodejsRt$clselect.clselectnodejs.node_managerRRPRRt&clselect.clselectpython.python_managerRt(clselect.clselectpythonuser.environmentsRtPythonEnvironmentt(clselect.clselectnodejsuser.environmentstNodeJsEnvironmenttclselect.utilsR R!R"R#R$R%tsecureioR&tclconfig.ui_config_libR'R(RtobjectR-(((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/selectorlib.pyt s\                  ".