jg D"ddlmZddlmZddlmZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z ddl mZmZmZmZdd lmZmZdd lmZmZddlZdd lmZdd lmZd ZdZdZdZdZ dZ!dZ"Gdde#Z$ddZ%ddZ&ddZ'ddZ(dS))print_function)absolute_import)divisionN)datetime) get_directory) check_call check_output list_dirs run_command)EXTENSION_PATTERN ExtensionInfo) Interpreter interpreters)JSONDecodeError)ClSelectExcept virtualenvz.virtualenv.backupz#/opt/cloudlinux/venv/bin/virtualenv#z/usr/share/l.v.e-manager/utilspython_wrapperzset_env_vars.pyceZdZddZdZdZddZddZddZd Z d d Z dd Z d Z dZ dZdZdZdZdZdZdZdZddZddZd!dZddZdZdS)" EnvironmentNc||_|r||_n/tjt jj|_tj|jj|_ tj |j d|_ | t|_n||_tj t|j|j||_ tj t|jt |j|_d|_d|_d|_d|z|_ddi|_dS)Nz .pip/pip.logpythonMySQLdbz MySQL-python)nameuserpwdgetpwuidosgetuidpw_namegetpwnampw_dirhomepathpathjoin pip_logfileDEFAULT_PREFIXprefix _abs_prefix BACKUP_PREFIX backup_path _requirements _interpreter_pipinterpreter_name_extension_remap)selfrrr)s _/opt/cloudlinux/venv/lib64/python3.11/site-packages/clselect/clselectpythonuser/environments.py__init__zEnvironment.__init__&s  :DII RY[[119DI TY//6 7<< ~FF >(DKK DKGLLTY !D!DdKK 7<<  = 1 149>>!  (4!*N ;c j|jjd|jjd|jd|jd|jd S)N.z(name='z ', user='z ', prefix='z')) __class__ __module____name__rrr)r2s r3__repr__zEnvironment.__repr__<s@ N % % %t~'>'>'> IIItyyy$+++/ 0r5cHtjjfd}|S)Nctjjtjjjtjd<jtjd<dS)NUSERHOME)rsetgidpw_gidsetuidpw_uidrenvironr#)r2user_pwdsr3funcz!Environment._demote..funcDsI Iho & & & Iho & & &!%BJv !)BJv   r5)rr"r)r2rGrFs` @r3_demotezEnvironment._demoteAs:< ** 1 1 1 1 1 1  r5c|j||d}|r||=t|||iS|S)N)r interpreter extensions)rrJrKgetattr)r2keyes r3as_dictzEnvironment.as_dictLsZI++--//++    +#D#&&* *r5Tc|j|d}|r)|d|i|r||=t |||iS|S)N)rrJrK)rrJrOupdaterKrL)r2rMwith_extensionsrNs r3 as_deepdictzEnvironment.as_deepdictWsI++--5577     HHdoo//     +#D#&&* *r5c2|st|j}|j}|r tj||}dt tj|j|j }td|d|j |g}| |j |d} t|i|n#tj$r}t#|}d} d|vrd} nvd|vrp|d |d d z} |d| d } | d ks| d kr|} n|d| } || d zd} n|} tj| | d}~wwxYw|dS)N) target_userz({}:{})z--promptz--python) preexec_fncwdwaitzDisk quota exceededzJDisk quota exceeded. Contact system administrator to increase disk quota. Traceback:r  )messagedetails)rrr%rr&formatrbasenamer)rVIRTUALENV_BINbinaryrHr$rrExternalProgramFailedstrfindrfindconfigure_environment) r2rJversionrXr%promptargskwargserr err_traceerr_texterr_char err_trace_ends r3createzEnvironment.createes =%$)<<>$'' 2;t+<+<+G+GHY+Z+Z   tr5Fctj|jd}tj||jdz}||}|dStj|rtj|tj|| tj|s=tjtjtt|n-#ttf$r|rtj||wxYwtjtj|tsbtjtjtttj|tdSdS)z Configures environment: 1. Rename binary to pythonX.Y_bin 2. Makes symlink from python binary to python_wrapper bin_binN)rr%r&r0r{existsremoverenamesymlink WRAPPERS_PATHPYTHON_WRAPPERIOErrorOSErrorSET_ENV_VARS_SCRIPT)r2 auto_restorerxnew_interpreter_pathinterpreter_paths r3rgz!Environment.configure_environments 7<< 511!w||Hd6KLLvU44X>>  # F 7>>. / / , I* + + + "$8999 7>>"233 Z 27<< ~FFHXYYY!    B .0@AAA   w~~bgll85HIIJJ D Jrw||M3FGGw||H.ABB D D D D D D Ds 0AD *D7c|j}|r tj||}tj|r(t ddd||dSdS)Nz/bin/rm-rz--interactive=never)rV)r%rr&rrrH)r2rhr%s r3destroyzEnvironment.destroys{y  /7<<g..D 7>>$   2 y$(=t"&,,.. 2 2 2 2 2 2 2 2r5c2||jvr |j|S|S)z Returns extensions name considering extension remap table :param extension_name: Input extension name :return: Result extension name )r1)r2extension_names r3_get_extension_namezEnvironment._get_extension_names& T2 2 2(8 8! !r5ctj|j|}tj||sdSt d|||||}g}tj|r8t|d}| }| | || |dt|d}| || t||dd ||dS) zX Recreate python virtual environment with requirements :return: rhNzRe-create python virtualenv:rT)rhrXwinstallr)rr%r&rpipprint _pip_freezepip_requirementsopen readlinescloserrq writelinesr)r2rhenv_pathrequirements_path requirements reqs_files r3 _recreatezEnvironment._recreatesj7<< 733w~~dhhwh7788  F ,h777 !!! 11':: 7>>+ , , .44I$..00L OO    W %%% G$ ///*C00 \*** HHWH % %y$  ! !' * * , , , , ,r5cztdD]}||dS)NrhrM)rkeysrr2rhs r3recreatezEnvironment.recreatesG# 2227799 $ $G NN7 # # # # $ $r5cJtj|jSN)rr%rr;s r3rzEnvironment.existssw~~di(((r5c^|js t|j|j|_|jS)N)r)rU)r.rr%rr;s r3rJzEnvironment.interpreters0  U +49$) T T TD   r5cL||}tj|j}|t }|d|ddpd}}ddd|dz|jzdz|zf}|r7|d}ddd|dz|jzdz|zd z|zf}tj|||rtd |zt|| |j | dS) Nrr /bin/bash-l-c --log-file=z install z==z6Extension '%s' install is prohibited. System extensionrjrVrW)rrget_locked_extensionsr0rtVERSION_DELIMITERrr'is_extensions_locked ValueErrorrrHr$r)r2rlocked_extensionst extensionrhcommands r3extension_installzEnvironment.extension_installsJ11.AA)?@UVV  !2 3 3qT1QRR5;B7 dDHHJJ,G$JZ,Z-!/-01  AajG"D$ ^0KdN^0^"1#%.1/15168?1@AG  -.?QX Y Y hUXffgg gDLLNN NNNN r5cddd|dz|jzd|zf}t|||j|dS)Nrrrrz install -r {}r)rr'r_rrHr$r)r2rrs r3extension_install_requirementsz*Environment.extension_install_requirements sudDHHJJ,G$JZ,Z#**+<==->?DLLNN NNNN r5c t|d|jzdd|||j|dS)N --log-file=rz --upgraderVrW)rrr'rHr$r)r2rs r3extension_updatezEnvironment.extension_updatesa488::}T-==k9"llnn$- A A A A r5c \tj|j}|t}|d|ddpd}}|r|d}tj|||rt d|ztj| d|j zd|f| tj tj tj |j d}|d \}}|jrt!|p||dS) Nrr rz$Extension '%s' removal is prohibitedr uninstallT)rVstdinstderrstdoutrWtexty)rrr0rtrrr subprocessPopenrr'rHPIPEr$ communicate returncode Exceptionr)r2rrrrhprrs r3extension_uninstallzEnvironment.extension_uninstalls$)?@UVV OO- . .qT1QRR5;B7  !ajG  -.?G T T QCiOPP P   XXZZt'77i P]a]i]i]k]k/*/? D B B Bs++ < .F,f-- - r5c i}tj|j} t|dd|jzd||j}dtj |D}n#ttttjtjf$r\t|dd|jz||j}t!j|}YnwxYwd|D}t%||D]\\}}}tj|||rt)t+d|dDt+||z } | rAt1||d kr|d | d ||<||d ||<|S) Nlistrz --format=jsonrc.g|]}|d|dfS)rrh).0xs r3 z*Environment.extensions..-s%PPP1V9a l3PPPr5c3^K|](\}}t|V)dSr)r extension_doc)rr_s r3 z)Environment.extensions..1sL00 Iq--i88000000r5c6g|]}|Sr)strip)rvs r3rz*Environment.extensions..5s (O(O(Oq(O(O(Or5,rz, )docrh)rrr0r rr'rHr$jsonloadsrKeyErrorrrFileProcessErrorrcr findallziprrsetrtgetlenr&) r2resultroutputrKdocsrrhr version_diffs r3rKzEnvironment.extensions(s,)?@UVV ;!$((**fmDDT6TVervr~r~sAsAGKGTUUUFPPTZ=O=OPPPJJ:~7VXfX|} ; ; ;!$((**fmDDT6TaeamamaoaouyvCDDDF*26::JJJ ;00$.000$' D$9$9 @ @ OT7S12CT7SS @#C(O(OGMM#sQ  7<< 7E5AA Ay > TYu==DIyr5c|&tj|j|dStj|jdS)Nzrequirement.pip)rr%r&rs r3rzEnvironment.pip_requirementsEs<  7<< 74EFF Fw||DI'8999r5cd}|}|r||j}ntd|j}t}tj|jr?t j|j dr|rtddS|jdtj dzz} t j|j} tj|j| t j| | j| j |jD]} t+j|j|jr|sd}|rtd| z:|r+t0jd |jd | d t7d d |j| f|| tdd}nk#t:t<f$rW} tdt?| z|D]} tj | | t j!| Yd} ~ nd} ~ wwxYw|st j!| |S)a_ copy binary python from /opt/alt/pythonXY/bin/pythonX.Y to virtualenvdir/bin/pythonX.Y :param backup: make backup old python interpreter :param force: force rewrite python interpreter without check :param verbose: print actions details to stdout :return: True - updating success; False - updating fail FrhrrszVNothing to do, binary in your virtual environment is already symlink to global python!z.orig_%sz%Y-%m-%d_%H-%Mz not need updating; skip '%s'z copy 'z' -> 'z'...z/bin/cpz--force)cmdDoneTzFail %sN)"rJrhrrrr%ru python_binrvrwrrnowstrftimestatshutilcopychownst_uidst_gid binary_listfilecmpcmprbsysrwriter appendrrrdcopyfileunlink)r2backupforceverbose_alt_interpreters_dict update_resultrJmain_interpreter updated_list python_backupstat_virtualenv_python_binrNupdated_pythons r3update_python_interpreterz%Environment.update_python_interpreterJs &&(( ! P5k6IJ  + :::;;NO vv 7>>+0 1 1 bk+BX6Y6Y6d6dev6w6w  pnooo5$.hlnn>U>UVf>g>g1gg  .// K*M:::  el;;; %)4)@  %;/6 8NOOX]$)MZ@CXXYYYtJ$$$CSCZCZCZ\q\q\q%rsssI7G7NPe fgggg##$9:::f  MM! % % % )c!ff$ % % %". ? ? ~>>>> Im $ $ $ $ $ $ $ $  %  % Im $ $ $s8B.G''I8A I  Ic8tj||sdS||ddf}t ||d}t |||j|dS)X Output installed packages in requirements format :return: None Nfreezerr)rjrVrWr) rr%rrrrrrHr$)r2rhrfs r3rzEnvironment._pip_freeze~s w~~dhhw//00  F88G$$h5 &&w// 5 5DLLNN}Q 0 0 0 0 0 0r5c|tdD]}||dS)rrhrrN)rrrrs r3 pip_freezezEnvironment.pip_freezesN $ 2227799 . .G   W  - - - - . .r5NNr)NT)NNN)F)FFTN)r:r9 __qualname__r4r<rHrOrSrqr{rgrrrrrrJrrrrrKrrrrrrr5r3rr$s<<<<,000           ,%,%,%,%\   DDDD82222 " " ",,,B$$$)))!!!    ",:::: 2222h 0 0 0 0.....r5rc|st}|r7tjt j|j|Stjt jtjj|Sr) r(rr%r&rr"r#rr )rr)s r3r*r*sd   Fw||CL..5v>>>w||CL55.sEUUQQYY3Y''--//00UUUUUUr5dictrrMrr)s` r3environments_dictr&s0 UUUU,tV:T:TUUU U UUr5cVtfdt||DS)Nc3K|]9}t|V:dSr )rrSr!r"s r3rz(environments_deepdict..sY55Q]]s]++113344555555r5r#r%s` r3environments_deepdictr)sE 5555%dF33555 5 55r5r)) __future__rrrrrrrrrrclselect.clselectctlrclselect.utilsrr r r rKr rrr simplejsonrrclselect.clselectexceptrr(r+rarrrrobjectrr*rr&r)rr5r3r0s&%%%%%&&&&&&  ......KKKKKKKKKKKK8888888833333333&&&&&&222222$ 60 !'l.l.l.l.l.&l.l.l.^ FFFF    VVVV555555r5