1 jJ.ddlmZddlmZddlmZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z ddl mZddlmZmZmZmZd d lmZmZd d lmZmZddlZdd lmZdd lmZdZdZdZ dZ!dZ"dZ#dZ$Gdde%Z&ddZ'ddZ(ddZ)ddZ*dS))print_function)absolute_import)divisionN)datetime)drop_privileges) 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*r3s r4__repr__zEnvironment.__repr__=s@ N % % %t~'>'>'> IIItyyy$+++/ 0r6cHtjjfd}|S)Nctjdkrtjgtjjtjjjtjd<j tjd<dS)NrUSERHOME) r geteuid setgroupssetgidpw_gidsetuidpw_uidrenvironr$)r3user_pwdsr4funcz!Environment._demote..funcEsl z||q   R   Iho & & & Iho & & &!%BJv !)BJv   r6)rr#r)r3rJrIs` @r4_demotezEnvironment._demoteBs:< ** 1 1 1 1 1 1 r6c|j||d}|r||=t|||iS|S)N)r interpreter extensions)rrMrNgetattr)r3keyes r4as_dictzEnvironment.as_dictSsZI++--//++    +#D#&&* *r6Tc|j|d}|r)|d|i|r||=t |||iS|S)N)rrMrN)rrMrRupdaterNrO)r3rPwith_extensionsrQs r4 as_deepdictzEnvironment.as_deepdict^sI++--5577     HHdoo//     +#D#&&* *r6c2|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&r r'formatrbasenamer*rVIRTUALENV_BINbinaryrKr%r rExternalProgramFailedstrfindrfindconfigure_environment) r3rMversionr[r&promptargskwargserr err_traceerr_texterr_char err_trace_ends r4createzEnvironment.createls =%$)<<>$'' 2;t+<+<+G+GHY+Z+Z   tr6Fctj|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)r r&r'r1r~existsremoverenamesymlink WRAPPERS_PATHPYTHON_WRAPPERIOErrorOSErrorSET_ENV_VARS_SCRIPT)r3 auto_restorer{new_interpreter_pathinterpreter_paths r4rjz!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)rY)r&r r'rr rK)r3rkr&s r4destroyzEnvironment.destroys{y  /7<<g..D 7>>$   2 y$(=t"&,,.. 2 2 2 2 2 2 2 2r6c2||jvr |j|S|S)z Returns extensions name considering extension remap table :param extension_name: Input extension name :return: Result extension name )r2)r3extension_names r4_get_extension_namezEnvironment._get_extension_names& T2 2 2(8 8! !r6ctj|j|}tj||sdSt d|||||}g}tj|rtjdkret|j 5t|d}| }| dddn #1swxYwYn8t|d}| }| ||||dtjdkrft|j 5t|d}||| dddn #1swxYwYn9t|d}||| t#||d d ||dS) zX Recreate python virtual environment with requirements :return: rkNzRe-create python virtualenv:rrT)rkr[winstallr)r r&r'rpipprint _pip_freezepip_requirementsrBrropen readlinescloserrt writelinesr )r3rkenv_pathrequirements_path requirements reqs_files r4 _recreatezEnvironment._recreates7<< 733w~~dhhwh7788  F ,h777 !!!!11':: 7>>+ , , "z||q  $TY//&& $%6 < GGxxzz=43C#C .2G  -.?QX Y Y hUXffgg gDLLNN NNNN r6c|d|jzdd|f}t|||j|dS)Nrrrr)rr(r rKr%r)r3rrs r4extension_install_requirementsz*Environment.extension_install_requirements$s]88::}t/??d$57DLLNN NNNN r6c t|d|jzdd|||j|dS)Nrrz --upgraderYrZ)r rr(rKr%r)r3rs r4extension_updatezEnvironment.extension_update*sa488::}T-==k9"llnn$- A A A A r6c \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)rYstdinstderrstdoutrZtexty)rrr1rwrrr subprocessPopenrr(rKPIPEr% communicate returncode Exceptionr)r3rrrrkprrs r4extension_uninstallzEnvironment.extension_uninstall0s$)?@UVV OO- . .qT1QRR5;B7  !ajG  -.?G T T QCiOPP P   XXZZt'77i P]a]i]i]k]k/*/? D B B Bs++ < .F,f-- - r6c 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)rrk).0xs r4 z*Environment.extensions..Fs%PPP1V9a l3PPPr6c3^K|](\}}t|V)dSr)r extension_doc)rr_s r4 z)Environment.extensions..JsL00 Iq--i88000000r6c6g|]}|Sr)strip)rvs r4rz*Environment.extensions..Ns (O(O(Oq(O(O(Or6,rz, )docrk)rrr1r rr(rKr%jsonloadsrKeyErrorrrFileProcessErrorrfrfindallziprrsetrwgetlenr') r3resultroutputrNdocsrrkr version_diffs r4rNzEnvironment.extensionsAs,)?@UVV ;!$((**fmDDT6TVervr~r~sAsAGKGTUUUFPPTZ=O=OPPPJJ:~7VXfX|} ; ; ;!$((**fmDDT6TaeamamaoaouyvCDDDF*26::JJJ ;00$.000$' D$9$9 @ @ OT7S12CT7SS @#C(O(OGMM# TYu==DIyr6c|&tj|j|dStj|jdS)Nzrequirement.pip)r r&r'rs r4rzEnvironment.pip_requirements^s<  7<< 74EFF Fw||DI'8999r6cd}|}|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 FrkrrvzVNothing 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)"rMrkrrr r&rx python_binryrzrrnowstrftimestatshutilcopychownst_uidst_gid binary_listfilecmpcmpresysrwriter appendrrrgcopyfileunlink)r3backupforceverbose_alt_interpreters_dict update_resultrMmain_interpreter updated_list python_backupstat_virtualenv_python_binrQupdated_pythons r4update_python_interpreterz%Environment.update_python_interpretercs &&(( ! 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  Ictj||sdS||ddf}tjdkrPt |j5t||d}dddn #1swxYwYn#t||d}t|| |j |dS)X Output installed packages in requirements format :return: None Nfreezez-lrr)rmrYrZr) r r&rrrBrrrrr rKr%)r3rkrfs r4rzEnvironment._pip_freezes, w~~dhhw//00  F88G$$h5 :<<1   ++ > >..w77== > > > > > > > > > > > > > > >T**733S99ADLLNN}Q 0 0 0 0 0 0s8$B((B,/B,c|tdD]}||dS)rrkrrN)rrrrs r4 pip_freezezEnvironment.pip_freezesN $ 2227799 . .G   W  - - - - . .r6NNr)NT)NNN)F)FFTN)r;r: __qualname__r5r=rKrRrVrtr~rjrrrrrrMrrrrrNrrr rrrr6r4rr%s<<<<,000 "        ,%,%,%,%\   DDDD82222 " " "0,0,0,d$$$)))!!! "  ",:::: 2222h0000(.....r6rc|st}|r7tjt j|j|Stjt jtjj|Sr) r)r r&r'rr#r$rr!)rr*s r4r+r+sd   Fw||CL..5v>>>w||CL55.sEUUQQYY3Y''--//00UUUUUUr6dictrrPrr*s` r4environments_dictr%s0 UUUU,tV:T:TUUU U UUr6cVtfdt||DS)Nc3K|]9}t|V:dSr)rrVr r!s r4rz(environments_deepdict..sY55Q]]s]++113344555555r6r"r$s` r4environments_deepdictr(sE 5555%dF33555 5 55r6r)+ __future__rrrr rrrrrrclcommon.clpwdrclselect.clselectctlrclselect.utilsr r r r rNrrrr simplejsonrrclselect.clselectexceptrr)r,rdrrrrobjectrr+rr%r(rr6r4r0s&%%%%%&&&&&&  ******......KKKKKKKKKKKK8888888833333333&&&&&&222222$ 60 !'L.L.L.L.L.&L.L.L.^ FFFF    VVVV555555r6