9e*jddlmZddlmZddlmZddlZddlZddlZddlZddlZddl 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;mZ>m?Z?ddl@mAZAddlBmCZDddlEmCZFddlGmHZHmIZImJZJmKZKmLZLmMZMddlNmOZOddlPmQZQmRZRGddeZ7Gdde7ZSdd iZTGd!d"eUZVdS)#)print_function)division)absolute_importN)Set) iteritems)FormattedException)resolve_username_and_doc_root)CP_NAMEdocroot)NoDomain NotSupported IncorrectData) exec_utility) clselectctl) clpassenger) ClUserSelectClSelect ClExtSelect)APP_STARTED_CONSTENABLED_STATUSDISABLED_STATUSBaseSelectorError)validate_env_vars)format_summaryAPI_1ClSelectExcept)NodeJSConfigError) NodeManager)PythonAppFormatVersionget_venv_rel_path) PythonManager) Environment)mkdir_p file_read file_writeget_using_realpath_keys get_abs_reldelete_using_realpath_keys)get_perm)_set_ui_configUIConfigExceptionceZdZdS)rN)__name__ __module__ __qualname__M/opt/cloudlinux/venv/lib64/python3.11/site-packages/clselector/selectorlib.pyrrFsDr2rceZdZdZdS)ClSelectDomainNotFoundzK Custom exception in case if user doesn't have the specific domain N)r.r/r0__doc__r1r2r3r5r5Js Dr2r5statusokc6eZdZdZdZdZedMdZedZedZ edNdZ edMd Z ed Z edNd Z d Zed ZdZdZedZedZdZdNdZedZdZedZdZdNdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$Z&d%Z'd&Z(d'Z) dOd(Z*ed)Z+dNd*Z,dNd+Z-ed,Z.dPd.Z/dQd0Z0d1Z1d2Z2d3Z3d4Z4ed5Z5d6Z6ed7Z7d8Z8d9Z9ed:Z:dNd;Z;dMd<ZZ>dRd?Z?d@Z@dAZAdBZBdCZCdNdDZDdEZEdFZFdGZGedHZHedIZIeJdJZKdKZLdLZMdS)SCloudlinuxSelectorLibcl||_d|_d|_d|_d|_d|_d|_d|_d|_d|_ d|_ d|_ |j|jkrLdd l m }||_ t|_tj|_ tj|_ dS|j|jkrLdd lm }||_ t'|_tj|_ tj|_ dS|j|jkrdd lm}||_dSdS) Nz/usr/bin/selectorctlz+/usr/share/l.v.e-manager/utils/dynamicui.py/usr/sbin/cloudlinux-selectornodejspythonrubyphpr)ApplicationsManager) PhpManager) interpreter_SELECTORCTL_UTILITYDYNAMIC_UI_CTL_CMDCLOUDLINUX_SELECTOR_UTILITYNODEJS_INTERPRETERPYTHON_INTERPRETERRUBY_INTERPRETERPHP_INTERPRETERselector_manager apps_managerselector_user_libselector_old_lib$clselect.clselectnodejs.apps_managerrArclselectclselectnodejsuserclselectctlnodejsuser$clselect.clselectpython.apps_managerr"clselectpythonuserclselectctlpython clselect.clselectphp.php_managerrB)selfrCrArBs r3__init__zCloudlinuxSelectorLib.__init__Us[&$:!"O+J("*"* &$ !% !% $  t6 6 6 P P P P P P 3 3 5 5D $/MMD !%-%@D "$,$BD ! ! !  !8 8 8 P P P P P P 3 3 5 5D $1OOD !%-%@D "$,$>D ! ! !  !5 5 5 C C C C C C$.JLLD ! ! !6 5r2cf|j|jkrdS|jjdS)za Checks that selector is able to work on current os environment :return: N)rCrJrK cl_select_libcheck_requirementsrWs r3check_selector_is_availablez1CloudlinuxSelectorLib.check_selector_is_availablews:  t3 3 3 F +>>@@@@@r2cn|j||}|||\}}|S)z7Get doc_root from application config or raise exception)rLget_app_domain$safely_resolve_username_and_doc_root)rWusernameapp_rootdomain_doc_roots r3safely_resolve_doc_root_for_appz5CloudlinuxSelectorLib.safely_resolve_doc_root_for_apps8"11(HEE??&QQ 8r2Nc t||\}}ng#t$rt|dnd||ddt$rt ddt idt $rt d ||ddwxYw||fS) a8 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 userrcNzNo such domain: %(domain)szNo such user: %(user)s)rcrimessagecontextz+Nodejs selector not supported for %(panel)spanelz3Domain %(domain)s is not owned by the user %(user)s)r r r5r rr r)rirc result_userresult_doc_roots r3r`z:CloudlinuxSelectorLib.safely_resolve_username_and_doc_roots" +H,,, (K   () <;/G"( $         L      T"( $    O++s A$A;cd}t\}}|d}nHt|tsd}n0|d |dd}n|dkr |dkrd}n|ddkrd}|S) z 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 TNF--user--domainr --interpreterr@)r* isinstancedict)optsresulteuidegids r3should_be_runned_as_userz.CloudlinuxSelectorLib.should_be_runned_as_usersZZ d <FFD$'' FF (^ #Z(8(@FF QYY4199FF / "e + +F r2c\|ddko |dduotjdkS)Nrsr@rqr)osgeteuid)rvs r3should_run_user_without_cagefsz4CloudlinuxSelectorLib.should_run_user_without_cagefss8O$-!H~T)!z||q  !r2c.tj|}|S)z 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 )pwdgetpwnam)riuserdatas r3_get_user_pwd_dataz(CloudlinuxSelectorLib._get_user_pwd_datas<%%r2c6||tdiddSdS)z Check if user and domain are None :param user: name of unix user :param domain: domain of panel user :return: None NBUser or domain parameter must be specified if current user is rootrjrrhs r3user_and_domain_checkerz-CloudlinuxSelectorLib.user_and_domain_checkers: B?"C88 DDc>ddi}tjrd|d<|SNrFT)rrress r3get_nodejs_selector_statusz0CloudlinuxSelectorLib.get_nodejs_selector_status,s+!5) == ) +&*C" # r2c:d|jjrtntiS)N PHPSelector)rKrrrr\s r3get_php_selector_statusz-CloudlinuxSelectorLib.get_php_selector_status3s1F1Wl~~]lmmr2c |j}|||S#t$r}||cYd}~Sd}~wwxYwN)rK get_summaryrget_selector_statusrr)rWrrs r3rz!CloudlinuxSelectorLib.get_summary6s )'3355C JJt//11 2 2 2J  ) ) )%%a(( ( ( ( ( ( ( )sAA A-A("A-(A-c>ddi}tjrd|d<|Sr)r"rrs r3get_python_selector_statusz0CloudlinuxSelectorLib.get_python_selector_status>s+!5) ?? + +&*C" # r2ct tj|jS#t$rt ddiwxYw)NrkzNo such user: `%(user)s`)rrpw_dirKeyErrorr)ris r3 get_user_homez#CloudlinuxSelectorLib.get_user_homeEsR <%%, ,    5"  s7ct}|||Sr)rrrr)rWrs r3get_nodejs_summaryz(CloudlinuxSelectorLib.get_nodejs_summaryNs:mm'')) 4++--... r2c$||}|j|jkr|j|||d}n<|j|jkr|j|||d}nt |g}|j|jkr|d|||:|j|jkr|d||| |||}|S)aD Runs script to execute other script inside user app environment :param user: str -> 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 npmr>z run-scriptNz--) rrCrGrLget_binary_pathrHNotImplementedErrorappendextend_run_interpreter) rWrirb script_name script_args user_homeinterpreter_pathcmdrws r3 run_scriptz CloudlinuxSelectorLib.run_scriptSs%&&t,,  t6 6 6#0@@h 5 2 2    !8 8 8#0@@h 8 5 5  &'' '   t6 6 6 JJ| $ $ $ ;  "4#::: 4   JJ{ # # #&&sIx@@ r2c>tj|tj||tjtjd} |\}}n'#t$r}td||ddd}~wwxYwd |j | | }dtj |i}|d d i|S) z Run interpreter in users environment :param cmd: list -> command to execute :param user_home: -> user home directory :param app_root: -> app path :return: dict T)argscwdstdoutstderrtextz6run-script call: `%(args)s` failed with error: %(err)s)rrrjNz%returncode: {} stdout: {} stderr: {} datar7success) subprocessPopenr|pathjoinPIPE communicateOSErrorrr returncodestripbase64 b64encodeencodedecoder) rrrbprrr output_stringrws r3rz&CloudlinuxSelectorLib._run_interpreterps"  "',,y(;;?:? G G G ]]__NFFF    2$'22""    & L LLNN LLNN   &*=+?+?+A+ABBIIKKL x+,,, s A%% B /BB cb|j|j|jfvr|jSdSr)rCrGrJrKrr\s r3get_fullzCloudlinuxSelectorLib.get_fulls9   79MN N N(4466 6 O Nr2ct}tj}t |D]\}}||xxdz cc<|D]}||d|d<|S)a_ Add selector usage statistics (amount of domains that use some version, etc) Fist parameter is an array with such format: [{'version': '5.6'}, {'version': '7.6'}] Output is an array with such format: [{'version': '5.6', 'users': 10}, ...] :type versions_list: list :rtype: list version total_users)rget_user_version_map collectionsCounterr) versions_listuser_version_mapversion_user_mapriritems r3_add_statistics_fieldz+CloudlinuxSelectorLib._add_statistics_fields(>>>>@@&.00&'788 + +MD' W % % % * % % % %! D DD"24 ?"CD  r2c^|j|jkrSt|jd}t |dt }t j|}n#|j|j}ni}| ddkr d|di}n|}|S)zG Retrieves supported versions list and default version Fjson)r api_versionNr7ERRORrk) rCrJrrrrrloadsrKget)rWr json_dataselectorctl_resultrws r3get_supported_versionsz,CloudlinuxSelectorLib.get_supported_versionss  t3 3 3D,--99%@@D&tFNNNI!%I!6!6    " .!%!6!B!B!D!D  !#   ! !( + +w 6 6 29 =>FF'F r2c|r|gnd}|j|jkr|j|S|dS)z3 Retrives current version for user NzSupported only by php selector)rCrJrKget_current_versionr)rWris r3rz)CloudlinuxSelectorLib.get_current_versionsQ'vv4  t3 3 3(<'(9:OO > > >I%%)))I*>?????")9=====  > "?33s)A AAc|j|jkr|S|j|jkr|S|j|jkr|SdSr)rCrGrrHrrJrr\s r3rz)CloudlinuxSelectorLib.get_selector_statusss  t6 6 62244 4  !8 8 82244 4  !5 5 5//11 16 5r2c|jj SrrKrr\s r3php_selector_is_disabledz.CloudlinuxSelectorLib.php_selector_is_disableds(999r2c|jjSrrr\s r3php_selector_is_enabledz-CloudlinuxSelectorLib.php_selector_is_enableds$55r2cp|j|jkrdS dtjvrtjdddlm}m}n#t$rYdSwxYw|rQ| s=|}|r1 |d}| dsdSn#t$rYnwxYwdS)z Returns True when MultiPHP system default PHP version is alt-php and PHP Selector is NOT disabled For details please see LVEMAN-1170 Fz/usr/share/cagefsr)is_ea4_enabledread_cpanel_ea4_php_confdefaultzea-phpT) rCrJsysrr cagefsctlrr ImportErrorr startswithr)rWrrconf default_phps r3check_multiphp_system_defaultz3CloudlinuxSelectorLib.check_multiphp_system_defaults   t3 3 35 "#(22 3444 J J J J J J J J J   55  >   D$A$A$C$C ++--D "&y/K&11(;;$#t$Dus#5A AAB&& B32B3c |j|j|jfvrqt|D]Z\}} |||}n.#t $r!}||cYd}~cSd}~wwxYw|tkr|cS[tS|} |d}n5#t$r(|d|j d|jcYSwxYwd|D}t| |z r^|dd t| |z d|j d|jd Sd } g} t|D]u\}} | r5t|jt!|n4t|jt!|| d z } v| t%|krtS| d kr&d d | t%|| iS|d| S)Navailable_versionszcorrupted answer from z --json --summary --interpreter ch|] }|d Srr1).0xs r3 z?CloudlinuxSelectorLib.set_supported_versions..s I I I!9 I I Ir2zinvalid alternative versions (z, z), see z --summary --interpreter z for valid versionsrrr7z>WARNING: only {} of {} commands was successful. Errors was: {}z&All commands were failedErrors was: {})rCrGrHrset_version_statusrrrrrrDsetkeysrrenable_versionstrdisable_versionrr) rWversionsrenable_disablerwrralternatives_listalternatives_versionsr errors_list to_enables r3set_supported_versionsz,CloudlinuxSelectorLib.set_supported_versionss   79PR R R+4X+>+> " "'1!44^WMMFF(111--a00000000001[((!MMM) //11  > )*> ?   > > >%%%)))4+;+;'=>> > > > >!J I7H I I I x}}  "7 7 '%%%IIc(--//225JJKKKKTMfMfMf$$$&'' '  "+H"5"5   GY I)**99#g,,GGGG)**::3w<<HHH qLGG c(mm # #  q[[++16'3x==++V+V  %%'77=vk7J7JLL Ls/A A- A( A-(A-B%%/CCcB |j|j|nv#tjjj$rt dd|idtjjtf$r,}|t|cYd}~Sd}~wwxYwtSNzNo such php version: %(ver)sverrj) rKswitch_default_versionrPclselectexceptrNoSuchAlternativeVersionBaseClSelectExceptionrrr rrWrrs r3set_default_versionz)CloudlinuxSelectorLib.set_default_version)s :$0%<   79PRVRfg g g//77 7 h gr2ctjs&tjstjrKt |jdgd\}}}|dkr)|d||SdS)Nz--sync-conf=allT)rrz"Can not sync UI with reason: {} {})detect is_cpanelis_pleskis_darrErr)rWretcodeoutrs r3rzCloudlinuxSelectorLib.update_uias     K!2!2 Kflnn K ,'*;),;;GZPP(MM$'''*@ > > >55c!ff======== >M 4 3s2AB2!BBBc|j|jkr` |j||nC#tjj$r,}|t|cYd}~Sd}~wwxYwtSr) rCrJrK set_optionsrPrrrr r)rWoptionsrrs r3r4z!CloudlinuxSelectorLib.set_optionsus  t3 3 3 >%11'7CCCC*@ > > >55c!ff======== >s.A.!A)#A.)A.c>||dd}||dkr'td|j|j|jkr@t jd|}|stdd|id|d S|St|ttfr;|j|jkrtt|St|S|d krtd d|id|S) a3 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 Nrz{} default version not definedz(?P\d+)z#Incorrect selector version: %(ver)srrjrnativezUnsupported version: %(ver)s) rrrrrCrGrematchgrouprtintfloatr )rWrrms r3resolve_versionz%CloudlinuxSelectorLib.resolve_version}sO ?"6688<<=NPRSSO&/R*?*?$%E%L%LTM]%^%^___4#:::H0/BBP(5Z6;_5M*O*OPPPwwy)))&& gU| , , $4#:::3w<<(((7||# h   -K.3W-="?"?@@ @r2c |||||}|!ttj|}|||\}} |j|jkr+|j ||||| |||| |j |  no|j|j kr%tj ||||| n:|j|jkr*|j ||||| |||||j |  nD#tjj$r-} |t%| cYd} ~ Sd} ~ wwxYwt&S)a 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 N)reenv_vars startup_file domain_name entry_pointrLpassenger_log_filere)rreapp_moderArBrCrLrE)rw)rr?rrrr`rCrHrNcreaterLrIrPclselectctlrubyrGrrrr r) rWrbapp_urirrircrGrBrArDrErers r3 create_appz CloudlinuxSelectorLib.create_apps$ $$T6222&&w//  (H)=)=>>HBB4PPh A4#:::%,,T8WgX`6>\9?[:>:K`r-tttt!T%:::(//h[c/dddd!T%<<<%,,(GWx%| &T5F[m- &< A A A11Q1@@ @ @ @ @ @ @ As)B*DE("E EEctj|j|}tj|st dd|id|S)z 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 zNo such application: %(app)sapprj)r|rrrisdirr)rbrapp_paths r3_get_application_pathz+CloudlinuxSelectorLib._get_application_pathsc7<<::w}}X&& A -K.3X->"@"@AA Ar2ct}||d||}|||}t j||}t j|stdd|id t|d5}| } | dtj| idddn #1swxYwY|S#t $r.} |t%| ddcYd} ~ Sd} ~ wwxYw) a  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 Nz&Configuration file not found: %(path)srrjrbrstrerrorr7)rr1rrrPr|rrexistsropenreadrrrr Exceptionrgetattr) rWrb config_pathrirwrrOfull_config_pathfrrs r3read_app_configz%CloudlinuxSelectorLib.read_app_configs!!## $$T4000**400--hAA7<<+>>w~~.//  G &(89   N&-- Ivvxx vv'7'='='D'D'F'FGHHH I I I I I I I I I I I I I I IM N N N11'!Z2L2LMM M M M M M M NsC/D(?AD D(DD("D#D(( E 2#EE E c||d||}|||}tj||} t |d5}|tj |dddn #1swxYwYtS#t$r.} | t| ddcYd} ~ Sd} ~ wwxYw)a 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 NwbrSr7)rrrPr|rrrUwriter b64decoderrWrrX) rWrbrYcontentrirrOrZr[rs r3save_app_configz%CloudlinuxSelectorLib.save_app_configs6 $$T4000**400--hAA7<<+>> N&-- 3(11222 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3  N N N11'!Z2L2LMM M M M M M M NsB#B93(B' B9'B++B9.B+/ B99 C1#C,&C1,C1ct|}||d|gn)||d|gntd|S)Nrrrqr)listrr)rircr result_argss r3_add_user_or_domainz)CloudlinuxSelectorLib._add_user_or_domain sf4jj      F3 4 4 4 4     $/ 0 0 0 0 !eff fr2FcZ||||j|jkrtdd|jid |D]}|j||| t S#tjj $r,}| t|cYd}~Sd}~wwxYw)an 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 zJUninstall command is available only for python interpreter, not %(interp)sinterprjN) rrCrHrrN uninstallrrPrrrr )rWrbmodulesrircskip_web_checkmodulers r3uninstall_modulesz'CloudlinuxSelectorLib.uninstall_moduless $$T6222  t6 6 6 gd.""   ! H H%//hGGGG H  &< : : :11#a&&99 9 9 9 9 9 9 :s!A**B*>!B%B*%B*r1c ||||j|jkrn |j||||jt S#tjj $r,}| t|cYd}~Sd}~wwxYw|j|j kr |r+|D]'}|j|||d||j(n?|r&|j||d|||jnd} | | St S#tjj $r,}| t|cYd}~Sd}~wwxYwtdd|jid)a 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 )rkrLNz9Please, specify modules or requirements file with modulesUnknown interpreter: %(interp)srhrj)rrCrGrNinstallrLrrPrrrr rHr) rWrbrircrk spec_filerjrrlrs r3install_modulesz%CloudlinuxSelectorLib.install_modules.s $$T6222  t6 6 6 #%--dH^;?;L.NNN #"*@ > > >55c!ff======== > !8 8 8 # ?")VV-55dHfdcqCGCT6VVVVV?)11$$ AO^b^o2qqqqVC99#>>>#"*@ > > >55c!ff======== > !<d."" s<#AB&!B B B&A+DE-!EEEcj||d |j|jkr!tj||n |||}n3#t$rtj dd|it$rd}YnwxYw|j|j |j fvr$|j ||||jntjdd|jinC#tjj$r,}|t'|cYd}~Sd}~wwxYwt(S)z Destroy specified application root directory and user name :param app_root: Application directory :param user: name of unix user :return: dict Nz\No such application or it's broken. Unable to find app-root folder by this path %(app_root)srbrj)rerLrorh)rrCrIrPrIdestroyrf TypeErrorClSelectExceptions WrongDatar5rGrHrNrLInterpreterErrorrrrr rrWrbrirers r3 destroy_appz!CloudlinuxSelectorLib.destroy_appZs $$T4000 :4#888(00x@@@@ $#CCD(SSHH ,6!['!.$$$#HHH$#(?AX'YYY)11$8?C?P2RRRR-= A!)4+; <>>>>&< : : :11#a&&99 9 9 9 9 9 9 :sB1C+ A! C+!-BC+BAC++D+?!D& D+&D+c||d |||}|j|j|jfvr#|j||||jntj dd|jitS#tj j $r,}|t|cYd}~Sd}~wwxYw)z Start specified application root directory and user name :param app_root: Application directory :param username: name of unix user :return: dict Nrorhrj)rrfrCrGrHrNstartrLrvrxrrPrrrr rWrbrarers r3 start_appzCloudlinuxSelectorLib.start_app~s $$Xt444 :;;HhOOHD$;T=T#UUU%++Hh$J[\\\\(9=%t'78:::: &< : : :11#a&&99 9 9 9 9 9 9 :sA1B C !C?C C c||d |||}|j|jkr#|j||||jnP|j|jkr#|j||||jntj dd|jitS#tj j $r,}|t|cYd}~Sd}~wwxYw)z Destroy specified application root directory and user name :param app_root: Application directory :param username: name of unix user :return: dict Nrorhrj)rrfrCrGrNrestartrLrHrvrxrrPrrrr r}s r3 restart_appz!CloudlinuxSelectorLib.restart_apps $$Xt444 :;;HhOOH4#:::%--h(DL]^^^^!T%<<<%--h(DL]^^^^(9=%t'78:::: &< : : :11#a&&99 9 9 9 9 9 9 :BB88C8 !C3-C83C8c||d |||}|j|jkr#|j||||jnP|j|jkr#|j||||jntj dd|jitS#tj j $r,}|t|cYd}~Sd}~wwxYw)z Start specified application root directory and user name :param app_root: Application directory :param user: name of unix user :return: dict Nrorhrj)rrfrCrGrNstoprLrHrvrxrrPrrrr rys r3stop_appzCloudlinuxSelectorLib.stop_apps $$T4000 :;;D(KKH4#:::%**48TEVWWWW!T%<<<%**48TEVWWWW(9=%t'78:::: &< : : :11#a&&99 9 9 9 9 9 9 :rc d|zdz}d|zdz}tjtj|dddD]}tj|s t |d}||vs||vra|||}|||} t|| d#t$rYtj \} } } tj ttj| YwxYwdS) z Replace old prompt and env_var in binaries in new environment Working with bytes here, because of python binary (:*binrR)moder^N)rglobr|rrrNr%replacer&IOErrorrexc_inforr_r  tracebackprint_tb) new_envold_envnew_relold_rel old_prompt new_prompt venv_bin_file old_activate _new_activate new_activaterd traceback_s r36_replace_old_env_and_prompt_in_binaries_in_environmentzLCloudlinuxSelectorLib._replace_old_env_and_prompt_in_binaries_in_environmentsxGmc)1133 Gmc)1133 !Yrw||GS%'M'MNN J JM7==// JJ#,]#F#F#FL~~''<77:;U;U(4(<(> C  C cLtj|s&t|tj||dStj|D]5}t jtj|||6tj |dS)z 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) r|rrTr$renamelistdirshutilmoverrmdir) old_directory new_directoryrs r3_move_app_from_old_dir_to_newz3CloudlinuxSelectorLib._move_app_from_old_dir_to_newsw~~m,, $ M " " " Im] 3 3 3 3 3 =11 N N BGLL==}MMMM H] # # # # #r2c  |j|} t|||}n%#t$rt jd|zwxYwt ||\}}t ||\}} tj| n3#t$r&} t j t| d} ~ wwxYw| ||| } t|| | t j |#t$rYnwxYw| |||} t||| } n%#t$rt j d|zwxYw| d}| d}|j||| |j}|j|jkrPt'||\}}t ||\}}t |t'|||d\}}n|j|jkrt |t*j|jjj|\}}t |t*j|jjj| \}}nt7t*j|d}t*j|d}t*j|}t*j|st+j|t?j |||!|||j|jkr|"||| ||j|jkrt'||\}}n:|j|jkr|j#||}nt7|jj$|||}|j%}t|||d }|tLkrmtOj(||||)d d}tOj*||||j|||d | tOj+||tY||||||<|j-||dS) a 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 8No such application (or application not configured) "%s"Nr r app_summaryrrr7 app_statusrErBrerBrE).rLget_user_config_datar'rrvNoSuchApplicationr(rcheck_directory ValueErrorrwr r AppRootBusyrN_get_environmentnamerCrHr!rGr|rrrM environmentsDEFAULT_PREFIXrdirnamerTmakedirsrrrr _get_prefixr#rrr unconfigurer configurerr)write_full_user_config_data)rWrirr full_config app_configold_absrnew_absrrnew_user_summaryold_user_summaryold_user_app_summaryrerenv_namerrel_venv_old_envrd_new_envrr new_env_dirprefix environmentrrpassenger_log_file_to_sets r3 _relocatezCloudlinuxSelectorLib._relocates<'<0?@@ @ @( 2$W-(99 --=m-L:NNNR   t6 6 6-dMBBMC%h  KHa&'mSIII!LNNKHaa  !8 8 8%dBGLL&3BG-M-MNNKHa&dBGLL&3BG-M-MNNKHaa&'' '',,x,,',,x,,gooh// w~~k** % K $ $ $ GW%%% **7G<<<  t6 6 6  G GQXZacj k k k  t6 6 6)$ >>IAvv  !8 8 8*66t]KKFF%'' ',9EEhPTV\]] ((**1,T=+NN|\ * * *  #D- 8 8 8(3M(B(F(FG[]a(b(b %  !$ ud>NPVai/9./I5N P P P P  m 4 4 4 #4 DDD%/ M" 55dKHHHHHs?."A:B B?!B::B?C?? D  D 'D99"EcX |j|j|jfvr||||n2|j|jkr"t j|||dnC#t jj $r,}| t|cYd}~Sd}~wwxYwtS)a= 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) rCrHrGrrIrPrIrelocaterrrr r)rWri old_app_root new_app_rootrs r3rzCloudlinuxSelectorLib.relocates :D$;T=T#UUUt\<@@@@!T%:::(11$ lTXYYY&< : : :11#a&&99 9 9 9 9 9 9 :sAA""B"6!BB"B"cd}tj|||}tj|||}tj|tj|krdStj|}tj|stj|tj||dS)a :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 rN) r|rrrealpathrrNrrr1) old_doc_root old_alias new_doc_root new_aliasrold_htaccess_filenew_htaccess_filenew_htaccess_paths r3_transit_htaccess_filez,CloudlinuxSelectorLib._transit_htaccess_filesGLLy(KKGLLy(KK 7  - . .7##$566 7 7 FGOO,=>>w}}.// + K) * * * %'899999r2c |j|} t|||}n5#t$r(t jd|wxYw||||} t|||} n5#t$r(t jd|wxYw| d} | d} || ntj |} |j ||||} | j}||dtkru||dd}t#j||| |j |dd ||d | t#j||| | | | t#j||n|| }|| | || | |d <|||d<|j||dS)a Change application URI :param user: application owner. unix like user name :param directory: directory with application. (app-root) :param alias: new alias (app-uri) for application or None if change only the domain :param new_doc_root: NEW doc_root to transit application to :param new_domain: NEW domain to transit application to :return: None z8No such application (or application not configured) "{}"rr NrrrETtransitrBr)rrrJrc)rLrr'rrvrrrrwr get_aliasrNrrCrrrrrrrrr)rWrirr new_domainrrr apps_summaryold_app_summaryrrrrrrs r3_transitzCloudlinuxSelectorLib._transitsf'<(B(BCWY](^(^ %  !$ 9d>NPVX\^g%J~4N#< > > > >  T9iQ]lx y y y y  i 0 0 0 0#+  ' ' iy Y Y Y ) 9  !#-Jx  55dKHHHHHs.2A ;B 2B?c |d}n|||\}}|j|j|jfvr||||||nB|j|jkr$t j||||ntnC#t j j $r,}| t|cYd}~Sd}~wwxYwtS)aV Call selectorctl to transit application to new_app_uri :param user: application owner :param app_root: application directory (application name) :param new_app_uri: new uri or None if change only the domain :param new_domain: new domain or None if change only the app_uri :return: json NrF)r`rCrHrGrrIrPrIrrrrrr r)rWrirb new_app_urirrrdrs r3rzCloudlinuxSelectorLib.transits :!# "&"K"KDR\"]"]<D$;T=T#UUU dHlJ TTTT!T%:::(00xWc0dddd)+++&< : : :11#a&&99 9 9 9 9 9 9 :sBBC&!C C Ccd}|r, ||}n#tj$rYnwxYw|j||j||dkrtjddS)z 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 rz tjdd}tjjd|tj djz<jdS)NrErBr %s_version)rrrrrCrrLr) rrrrrrerrWrirs r3actionz5CloudlinuxSelectorLib._change_version..actionTs  #D) 4 4 4(3I(>(B(BCWY](^(^ %  !$ 5$:JF]e/9./I5N P P P P  i 0 0 0FMK "<$2B#B C   9 9$ L L L L Lr2)rcrrz,An error occured during changing version. %sN)rLrr'rrvrrNrrrCas_dict_create_environment_ensure_version_enabledr r&rHrrGrrsummaryr_get_info_about_webappcheck_response_from_webappr)rWrirrrkold_environmentnew_environmentinstalled_extensionsuser_summary_datar app_domainrrrrrrers```` @@@@@r3_change_versionz%CloudlinuxSelectorLib._change_version*s'<R S S S S  !8 8 8  , ,T9oOc d d d(/55-dI?PQQ y) ,,..5 1HHVZ[[z M M M M M M M M M M M M M  k%@@%!A &1 k k k(45cfi5ijjj k FHHHHHs!7"A<GH*HHc4 |j|j|jfvrt|j|jkrM|j||dtj}|tjkrddiS|j ||tkr| ||||n| |||tS#tjj$r,}|t%|cYd}~Sd}~wwxYw)ax 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 app_versionr7zThis 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.)rkN)rCrGrHrrLget_app_configrr LEGACYget_app_statusrr_change_version_for_stopped_apprrPrrrr )rWrirb new_versionrkrrs r3change_versionz$CloudlinuxSelectorLib.change_versionms> :(?AX'YYY))4#:::"/>>tXNNRR!#9#@BB "8"??? #L //h??CTTT$$T8[Q_$````44T8[QQQ &< : : :11#a&&99 9 9 9 9 9 9 :s%A8C;ACD+!D DDc$|j|jks|j|jkro|||} |j||||dS#t $r,}tjd |d}~wwxYwdS)NzRUnable to set environment variables in htaccess file for the application.Error: {}) rCrHrGrfrLadd_env_vars_for_htaccessrWrvrr)rWrirbrArers r3set_variables_for_litespeedz1CloudlinuxSelectorLib.set_variables_for_litespeeds  t6 6 6$:JdNe:e:e;;D(KKH !;;D(HV^_____   (4 &s   ;f:esA B !'BB c |j|} t||| } n%#t$rt jd|zwxYw|j|jkr8|6| d|kr*| dtj krt j d||| d<||| d<||| d<||| d<||| d ks|j|g|| d krN|| d <|j|jkr9|j |||} |j ||| || |d krdn|| d <|j ||} t!j|} t||| }|d }| j}|d }|d}t!j||6| d !t!j||||j|||n4t!j||||j||| d |t!j|||j|| ||||dS)al Set application mode, environment variables and startup_file for application :param config_files: names of config files (such as requirements.txt or etc) :param entry_point: the specified entrypoint for application :param user: application owner. unix like user name :param directory: directory with application :param app_mode: expected application mode :param env_vars: dict with environment variables for application :param startup_file: main file for application :param passenger_log_file: Passenger log filename :return: None rNrArzUnable to set environment variables. Application was created too long time ago. Please, migrate your application to newer version before changing interpreter versionrGrD config_filesrBr7rErr r)r)rerEr)rLrr'rrvrrCrHr rrrrN_get_full_path_to_startup_file setup_wsgirrrr _unconfigurerrrr)rWrirrGrArBrDrrErapp_config_datastartup_file_full_pathenv user_summaryuser_app_summaryrrre htaccess_paths r3_set_variablesz$CloudlinuxSelectorLib._set_variabless.'</#t'>>>-1-B-a-a!$..*)44T9F\^ijjj!-ASVX@X@X^p 45'88yIIC&.t44L6tY UU $W-E__&&-F' 2H,Z8M  $m < < < <#(;(;N(K(K(S%dIud>NPVai9KMMMMM%dIud>NPVai3B3F3F~3V3V9KMMMM D),,, 55dKHHH ((y(CCCCCs ."Ac "|O ttj|} n.#ttf$r|dcYSwxYwd} |j|j|jfvrA|j ||tkr| |||| ||||n| |||| ||||tS#tjj$r,} |t%| cYd} ~ Sd} ~ wwxYw)ak 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 Nz/wrong json format for environment variable list)rrrrurrrCrGrHrLrrr%_set_variables_for_stopped_apprrPrrr ) rWrirbrGrArBrDrrEenv_dictrs r3 set_variablesz#CloudlinuxSelectorLib.set_variabless`   i,TZ-A-ABBz* i i i556ghhhhh iH :D$;T=T#UUU%44T8DDHYYY##D(Hh Vaco$6888833D(HhXd4?Oaccc &< : : :11#a&&99 9 9 9 9 9 9 :s.!&&AAA8CD"!D D Dc |j|}|S#t$r}|j|jdcYd}~Sd}~wwxYw)z 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 )rwrlN)rLget_applications_users_inforrkrl)rWri result_dictrs r3get_apps_users_infoz)CloudlinuxSelectorLib.get_apps_users_infosc  ?+GGMMK   ? ? ?iAI>> > > > > > > ?s A<AAc||j|s!tj||ddS)z 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 zversion is not enabledN)rKis_version_enabledrPrUnableToSetAlternative)rWrras r3rz-CloudlinuxSelectorLib._ensure_version_enabled!sF$77 DD r)@@;Xpqq q r rr2c"||||j||}|j|||d}t |}|j|||d}|D]7} ||#tj j j $rY4wxYw|j |} || |d|j z<|j|| dS)z 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 Nr)rrLget_interpreter_version_for_apprNrr r&rrPrrrrrCr) rWrarbr old_versionr rr rrs r3rz5CloudlinuxSelectorLib._change_version_for_stopped_app+s* $$[(;;;'GGRZ[[ /CCHhXceijj_7799::/CCHhXceijj'  I 11)<<<<*9O    &;;HEE @K 8\D,<<= 55h KKKKKsB((CCc |j|} |r || |d<|r || |d<|r*|| |dkr || |d<|r || |d<|r || |d<||dkr || |d<n d| |d<|j|| ||||dS) a Sets new app_mode, environment variables and startup file for stopped NodeJS 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 str username: application owner :param str app_root: application directory (application name) :param str app_mode: New application mode, can be None :param dict env_vars_dict: New environment variables, can be None :param startup_file: New startup file, can be None :param passenger_log_file: Passenger log filename :return: None rGrArBrDrNr7rE)rLrrrr) rWrarbrG env_vars_dictrBrDrrErs r3r'z4CloudlinuxSelectorLib._set_variables_for_stopped_appFs&;;HEE  8/7Jx  ,  =/2=Jx  /  @3?Jx  0  ).@B.F.F9KJx !5 6 69=Jx !5 6 55h KKK ((8]KKKKKr2cltt|ddS)z Retrieves major version from full. If already short, return it with no difference :param version: Full/short :return: Short version as string .r)r r<splitrs r3get_major_version_from_shortz2CloudlinuxSelectorLib.get_major_version_from_shortgs+3w}}S))!,--...r2cttd}t }|D]}||dS)z Replace mysqli extension to nd_mysqli for defaults. Warning: only for PHP. See LVEMAN-1399 for details :return: r@N)rdrget_all_alternatives_datar rlist_extensions)alt_php_versions_list cl_ext_select alt_php_vers r3replace_mysqliz$CloudlinuxSelectorLib.replace_mysqlipsi!%Xe__%N%N%P%P%U%U%W%W X X# 0 7 7K  ) )+ 6 6 6 6 7 7r2ctjddgtjddgtjgdtjdg|dS)zf Setup php selector for work (suggested to use after native php is installed) rz--force-updatez --remount-all)r<zmake-defaults-configz--jsonrsr@z//usr/share/l.v.e-manager/utils/cache_phpdata.pyN)r check_outputr@)clss r3setup_selectorz$CloudlinuxSelectorLib.setup_selectors .> ?@@@o >???!C!C!C D D D!R STTT r2c|j|jkrttjrt S |jt S#t$r,}| t|cYd}~Sd}~wwxYw)zn Scan users home dirs for .htaccess files and import applications to new config file. N) rCrHrr*r-rrL$import_legacy_applications_to_configrWrr )rWrs r3run_import_applicationsz-CloudlinuxSelectorLib.run_import_applicationss  t6 6 6% % \^^   :   B B D D D  : : :11#a&&99 9 9 9 9 9 9 :sA B !B>B B c|j|jkrtd|j||t S)z_ Convert applications created in older selector versions to new format z/Migration is only available for python selector)rCrHrrLmigrate_applicationr)rWrirbs r3run_migrate_applicationz-CloudlinuxSelectorLib.run_migrate_applicationsM  t6 6 6%'<== = --dH===r2)NNr)NNNNNNN)NNF)NNFNr1)NF)Nr.r/r0rXr]rf staticmethodr`rzr~rrrrrrrrrrrrrrrrrrrrrrrrr r#r%r(rr2r4r?rKrPr\rbrfrmrrrzr~rrrrrrrrrrrrrrrr%r)r-rrr'r9r@ classmethodrDrGrJr1r2r3r:r:Ts 1 1 1D A A A .,.,.,\.,`\.!!\! \   \ \    \ """H\ nnn)))\ \ :\>777\**HHHH 4 4 4222:::6664*L*L*LX            888   BHLim****X  \ NNNN8NNNN*\4****X"""H:::(:::,:::,JJ\J,%%%N$$\$"pIpIpId(::\:23I3I3I3Ij0qqq&\6AAAAF":":":H   UDUDUDn : : :D ? ? ? ?rrrLLL6LLLB//\/ 7 7\ 7  [ :::     r2r:)W __future__rrrrrrrrrr|r9rrrtypingr future.utilsr cldetectlibr*clselect.clselectctlnodejsuserrPclselect.clselectexceptclselect.clselectctlpythonclselect.clselectctlrubyclselect.clselectpythonuserclselect.clselectnodejsuserclcommon.clexceptionrclcommon.clpwdr clcommon.cpapir r clcommon.cpapi.cpapiexceptionsr r r cllimits.librrrrrrclselect.baseclselectrrrrrclselect.clselectctlphprrrrvclselect.clselectnodejsr$clselect.clselectnodejs.node_managerrrSr r!&clselect.clselectpython.python_managerr"(clselect.clselectpythonuser.environmentsr#PythonEnvironment(clselect.clselectnodejsuser.environmentsNodeJsEnvironmentclselect.utilsr$r%r&r'r(r)secureior*clconfig.ui_config_libr+r,r5robjectr:r1r2r3ris&%%%%%&&&&&&   """"""%%%%!!!!""""""""333333888888++++++++PPPPPPPPPP%%%%%% 8888888888gggggggggggg<<<<<<99999999HHHHHH555555<<<<<<A@@@@@UUUUUUUUUUUUDDDDDDDD     '        ^    RRRRRFRRRRRr2