§ À•¿j´Èãóà—ddlmZddlmZddlmZddlZddlZddlZddlZddlZddl m Z ddl Z ddl Z ddl Z ddlZddlZddlmZddlmZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd l m!Z!m"Z"m#Z#ddl$m%Z%m&Z&ddl'm(Z(m)Z)ddl*m+Z+ddl,m-Z-ddl.m/Z/ddl0m1Z1ddl2m3Z3ddl4m5Z5ddl6m7Z7ddl8m9Z9m:Z:m;Z;ddl8mZ>m?Z?m@Z@ddlAmBZBddlCm@ZDdZEd„ZFGd„d eG¦«ZHdS)!é)Úprint_function)Úabsolute_import)ÚdivisionN)ÚAnyStr)Ú iteritems)ÚClPwd)ÚFormattedException)Ú MailHelper)Úis_ascii_string)ÚCloudlinuxLicenseLib)Ú clselectctl)Ú get_abs_relÚmkdir_pÚrun_process_in_cagefs)ÚBaseSelectorErrorÚAcquireApplicationLockError)Úprint_dictionaryÚreplace_params)Ú CONFIG_DIR)Ú PkgManager)Úis_clpassenger_active)Ú defaultdict)ÚMIMEText)Úmkstempé)Úbun_delivery_hook)ÚNODEJSÚPYTHONÚPHP)Úparse_cloudlinux_selector_opts)ÚCloudlinuxSelectorLibÚ OK_RES_DICTÚClSelectExcept)ÚWebsite)r#z.lockcó"—t||¦«S©N)Úopen)Ú file_nameÚmodes úM/opt/cloudlinux/venv/lib64/python3.11/site-packages/clselector/cl_selector.pyÚ_openr+>s€Ý � ˜4Ñ Ô Ð ócóÌ—eZdZd„Zd„Z d5d„Zd„Zd„Zd„Zd„Z e d „¦«Z d „Z d „Z d „Zd „Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd6d„Ze d„¦«Z d7d!„Z!e"d"„¦«Z#e"d#„¦«Z$e%j&d$¦«Z'e(d%„¦«Z)d&„Z*e+j,d'„¦«Z-d(„Z.d)„Z/d*„Z0d+„Z1d,„Z2d-„Z3d.„Z4d/„Z5d0„Z6d1„Z7d2„Z8e d3„¦«Z9d4S)8ÚCloudlinuxSelectorcó—d|_i|_d|_tj¦«dk|_d|_d|_d|_d|_ d|_ tj   td¦«|_dS)NFrz --backgroundÚzcloudlinux-selector_bkg.pid)Ú_is_jsonÚ_optsÚ _selector_libÚosÚgeteuidÚ _is_root_userÚ_lockÚ_node_install_lock_handoffÚ_is_bkg_option_presentÚ _bkg_optionÚ_nj_ver_move_fromÚpathÚjoinrÚ_pid_file_name©Úselfs r*Ú__init__zCloudlinuxSelector.__init__Dsq€ØˆŒ ؈Œ Ø!ˆÔåœZ™\œ\¨QÒ.ˆÔ؈Œ Ø*/ˆÔ'Ø&+ˆÔ#Ø)ˆÔØ!#ˆÔÝ œgŸlšl­:Ð7TÑUÔUˆÔÐÐr,cóH—|jdttfvrdSt|jd|jdg¦«rdSt|jd|jd|jd|jdo|jdtk|jd |jd |jd |jd |jd |jd|jd|jd|jd|jd|jdg¦«rdSdS)zx Check if cloudlinux-selector called with application operations :return: True if lock is need ú --interpreterFúchange-version-multipleÚcreateÚstartÚrestartÚdestroyÚmigrateÚstopúinstall-modulesúuninstall-modulesú run-scriptú --app-modeú --env-varsú--new-app-rootú --new-domainú --new-app-uriú --new-versionú--startup-fileT)r2rrÚanyr?s r*Úis_app_lock_neededz%CloudlinuxSelector.is_app_lock_neededQs€ð Œ:�oÔ &­vµvÐ.>Ð >Ð >Ø�5å �” Ð4Ô5°t´zÀ(Ô7KÐLÑ MÔ Mð Ø�5Ý Ø ŒJ�wÔ Ø ŒJ�yÔ !Ø ŒJ�yÔ !Ø ŒJ�yÔ !Ð K d¤j°Ô&AÅVÒ&KØ ŒJ�vÔ Ø ŒJÐ(Ô )Ø ŒJÐ*Ô +Ø ŒJ�|Ô $Ø ŒJ�|Ô $Ø ŒJ�|Ô $Ø ŒJÐ'Ô (Ø ŒJ�~Ô &Ø ŒJ�Ô 'Ø ŒJ�Ô 'Ø ŒJÐ'Ô (ð*ñ +ô +ð ð �4؈ur,Fcó†—| ¦«sdS|jd|jd}}|jj ||| | ¬¦«\}}t j |¦«sdSt j |t¦«} t|d¦«|_ tj |j  ¦«tjtjz¦«dS#t"$r<}|jt$jkrd} t)|| ¬¦«‚t)|¦«‚d}~wwxYw)z[ Acquire lock for application if this lock is needed :return: None Nú--userú --app-root)Ú chk_app_rootÚchk_envza+z6Disk quota exceeded. Please, free space and try again.)Úreason)rVr2r3Ú apps_managerÚget_app_foldersr4r<Úexistsr=ÚLOCKr'r7ÚfcntlÚflockÚfilenoÚLOCK_EXÚLOCK_NBÚIOErrorÚerrnoÚEDQUOTr) r@Úignore_missing_app_rootÚignore_missing_doc_rootÚusernameÚapp_rootÚ_Úapp_venvÚ lock_fileÚer\s r*Úacquire_app_lock_if_neededz-CloudlinuxSelector.acquire_app_lock_if_neededos7€ð×&Ò&Ñ(Ô(ð Ø ˆFØ!œZ¨Ô1°4´:¸lÔ3K�(ˆØÔ(Ô5×EÒEØ �hÐ1HÐ-HØ/Ð/ðFñ1ô1‰ ˆˆ8õŒw�~Š~˜hÑ'Ô'ð Ø ˆFõ ”G—L’L ­4Ñ0Ô0ˆ ð 8ݘi¨Ñ.Ô.ˆDŒJÝ ŒK˜œ ×)Ò)Ñ+Ô+­U¬]½U¼]Ñ-JÑ KÔ KÐ KÐ KÐ KøÝð 8ð 8ð 8ØŒw�%œ,Ò&Ð&ØQ�Ý1°(À6ÐJÑJÔJÐJÝ-¨hÑ7Ô7Ð 7øøøøð  8øøøs AC:Ã: EÄ7D;Ä;EcóÚ—|jr#|j d¦«tksdS|j€dS|j ¦«}t j|d¦«d|_|S)aìPass the continuously held Selector lock descriptor through npm. This process's own app lock (acquire_app_lock_if_needed, above) is held across the whole `run()` call for any non-root install-modules. The Node.js npm subprocess receives a duplicate of that same open-file description: Shared node_modules Store keeps it through resolve, delivery and rebuild, and classic npm keeps it through unshare and the final mutation. Reasserting flock on that description does not create a second lock or release the Selector parent's ownership. Root callers never hit this: they take the bun_delivery_hook branch in run() and never reach acquire_app_lock_if_needed() at all. This marks the existing descriptor inheritable immediately before the npm child is spawned. The callback after npm merely clears inheritable; the Selector copy remained locked through Passenger restart and the health check. rCNT) r3r2Úgetrr7rcr4Úset_inheritabler8)r@Úfds r*Ú,_release_app_lock_for_bun_delivery_if_neededz?CloudlinuxSelector._release_app_lock_for_bun_delivery_if_needed�sl€ð$Ô"ð  t¤z§~¢~°oÑ'FÔ'FÍ&Ò'PÐ'PØ ˆFØ Œ:Ð Ø ˆFØ ŒZ× Ò Ñ Ô ˆÝ Ô˜2˜tÑ$Ô$Ð$Ø*.ˆÔ'؈ r,cóŒ—|jsdS|j�,tj|j ¦«d¦«d|_dS)z@Finish descriptor handoff; the Selector lock was never released.NF)r8r7r4rtrcr?s r*Ú&_reacquire_app_lock_after_node_installz9CloudlinuxSelector._reacquire_app_lock_after_node_installªsI€àÔ.ð Ø ˆFØ Œ:Ð !Ý Ô ˜tœz×0Ò0Ñ2Ô2°EÑ :Ô :Ð :Ø*/ˆÔ'Ð'Ð'r,có^—|jr#|jdr| ¦«dSdSdS)NrS)r6r2Úsend_notificationr?s r*Úsend_notification_if_neededz.CloudlinuxSelector.send_notification_if_needed²sG€Ø Ô ð % $¤*¨_Ô"=ð %Ø × "Ò "Ñ $Ô $Ð $Ð $Ð $ð %ð %ð %ð %r,có—dSr&) rr2ÚcpapiÚcpinfor ÚsendmailÚ IndexErrorÚKeyErrorÚcpapiexceptionsÚ NotSupported)r@ÚMSG_TEMPÚmsgÚmeÚ cp_userinfoÚuser_data_emailÚ mailhelpers r*rzz$CloudlinuxSelector.send_notification¶s €ð ˆr,cól—|sdSd„| ¦« d¦«D¦«S)N©có—g|]}|¯|‘ŒSr‹r‹)Ú.0Úmodules r*ú z4CloudlinuxSelector.parse_modules..Ús€ÐRÐRÐR˜6È6ÐR�ÐRÐRÐRr,ú,)ÚstripÚsplit)Úmodules_optionss r*Ú parse_modulesz CloudlinuxSelector.parse_modulesÖs=€àð Ø�2ØRÐR _×%:Ò%:Ñ%<Ô%<×%BÒ%BÀ3Ñ%GÔ%GÐRÑRÔRÐRr,c ó¸—d|v|_|j|v|_|jr| |j¦« t ¦«}| ¦«sGd|_| ddi¦«|jr" tj|j¦«S#YSxYwS|  |¦«|_ t|j d¦«|_ |j   ¦«|j dr�|j dtkrw|js| ddi¦«| ¦«}| d¦«d vrd nd |jr" tj|j¦«S#YSxYwS|j  |j ¦«�rŒ| ¦«5t)j|j |j dt¦«} |ot)j¦«}n~#t(jj$rg| t5t(j¬ ¦«¦«Yd d d ¦«|jr$ tj|j¦«d S#Yd SxYwd SwxYw|�rt)j|j d|j d|j d¬¦«}|t(jurnÎ|r\| t5|¬ ¦«¦« d d d ¦«|jr$ tj|j¦«d S#Yd SxYwd S| ¦«| t5d¬ ¦«¦« d d d ¦«|jr$ tj|j¦«d S#Yd SxYwd St?|j d|j j |¦«}|d}| !|d¦«| ¦«d d d ¦«n #1swxYwY||jr" tj|j¦«S#YSxYwS|j  "|j ¦«r¸dd|j d|j j g|z}| ¦«5tGj$|i¬¦«} |  %¦«| ¦«d d d ¦«n #1swxYwY| j&|jr" tj|j¦«S#YSxYwS| '|j d|j d¬¦«|j drc| (|j d|j d¦«\} } | dkr | |j d<n#| t5| ¬ ¦«¦«|j dr| )¦«�n |j dr| ¦«�nê|j dr| *¦«�nÇ|j dr| +¦«�n¤|j dr| ,¦«�n�|j dr| -¦«�n^|j d r| .¦«�n;|j d!r| /¦«�n|j d"r| 0¦«�nõ|j d#r| 1¦«�nÒ|j d$rZ| 2¦«rD|j dtkr. |jr$ tj|j¦«d S#Yd SxYwd S�nk|j d%r| 3¦«�nH|j d&s |j d'r| 4¦«�n|j d(s |j d)r| 5¦«né|j d*r]| |j  6|j d|j d|j d+|j d,¦«¦«n|j d-r| 7¦«n]|j d.r|j  8¦«n6|j d/r| 9¦«n| :¦«�n!#tvj<tvj=tvj>f$r;} | t5t| ¦«¬ ¦«¦«Yd } ~ �nÅd } ~ wtvj@tvjAf$rU} |j d.s.| t5| jB| jC¬0¦«¦«t‰d ¦«Yd } ~ �nWd } ~ wtvjE$r.} | t5| ¬ ¦«¦«Yd } ~ �nd } ~ wtŒ$rt} | jGr5| t5| jB| jC| jG¬1¦«¦«n.| t5| jB| jC¬0¦«¦«Yd } ~ n d } ~ wt�$r�} t“jJ¦«}t“jKt™| ¦«| ¦«}t›|tœ¦«rd2 O|¦«}n|}| t5||¬3¦«¦«Yd } ~ nd } ~ wwxYw|jr" tj|j¦«n6#Yn2xYwn.#|jr" tj|j¦«w#YwxYwwxYwd S)4z$ Run command action ú--jsonTÚresultzCloudlinux license isn't validrCrIz"Node.js migration must run as rootÚstate©ÚeligibleÚmigratedrr©r—NrXrYú--skip-web-check)Úskip_web_checkÚsuccessÚ returncodeÚoutputz /usr/bin/sudoz-u)ÚenvrH)rirjú--passenger-log-fileÚOKÚsetúimport-applicationsrErFrGrJz read-configz save-configrKrLúinstall-versionzuninstall-versionúenable-versionzdisable-versionrMz --script-namez rDzmake-defaults-configÚsetup©r—Úcontext)r—r«Údetailsú )r—r¬)Pr1r:r9Úremover Úget_license_statusÚ_error_and_exitr4r>Ú _parse_argsr2r!r3Úcheck_selector_is_availablerr6Úrun_migrate_applicationrsÚshould_be_runned_as_userÚ_lock_interpreter_if_neededrÚis_deliverableÚ is_enabledÚnode_modules_storageÚ StorageErrorÚ _print_dataÚdictÚCAPABILITY_UNAVAILABLEÚdeliver_modulesÚCLASSIC_NPM_FALLBACKr{rÚCLOUDLINUX_SELECTOR_UTILITYÚ_print_raw_dataÚshould_run_user_without_cagefsÚ subprocessÚPopenÚ communicater rqÚ!_passenger_log_filename_validatorÚrun_setÚrun_import_applicationsÚ run_createÚ run_destroyÚ run_startÚ run_restartÚrun_stopÚrun_read_configÚrun_save_configÚrun_install_modulesÚrun_uninstall_modulesÚrun_manage_versionÚrun_disable_or_enable_versionÚ run_scriptÚ_start_change_all_apps_versionsÚreplace_mysqliÚ run_setupÚrun_getÚClSelectExcept_oldÚConfigNotFoundÚ WrongDataÚNoSuchAlternativeVersionÚstrÚNativeNotInstalledÚMissingCagefsPackageÚmessager«ÚexitÚFileProcessErrorr r¬Ú ExceptionÚ tracebackÚ format_excÚformat_exception_onlyÚtypeÚ isinstanceÚlistr=)r@ÚargvÚlicencer—Ú deliverableÚshared_store_enabledÚfailurer Ú user_run_cmdÚprocessrßÚ log_filenamerpÚerrr…Ú list_err_msgÚerr_msgs r*ÚrunzCloudlinuxSelector.runÜsX €ð! DÐ(ˆŒ à&*Ô&6¸$Ð&>ˆÔ#Ø Ô &ð *Ø �KŠK˜Ô(Ñ )Ô )Ð )ði Ý*Ñ,Ô,ˆGØ×-Ò-Ñ/Ô/ð ZØ $�” Ø×+Ò+¨XÐ7WÐ,XÑYÔYð@Ô*ð ðÝ”I˜dÔ1Ñ2Ô2Ð2Ð2øðØ�Døøøð  ð{×)Ò)¨$Ñ/Ô/ˆDŒJÝ!6°t´zÀ/Ô7RÑ!SÔ!SˆDÔ Ø Ô × :Ò :Ñ <Ô <Ð <ðŒz˜)Ô$ð S¨¬°OÔ)DÍÒ)NÐ)NØÔ)ð[Ø×(Ò(¨(Ð4XÐ)YÑZÔZÐZØ×5Ò5Ñ7Ô7�Ø"ŸJšJ wÑ/Ô/Ð3KÐKÐK�q�qÐQRÐRð`Ô*ð ðÝ”I˜dÔ1Ñ2Ô2Ð2Ð2øðØ�Døøøð  ð_Ô!×:Ò:¸4¼:ÑFÔFñ4 *Ø×5Ò5Ñ7Ô7ð*7ð*7õ#4Ô"BØœ  D¤J¨Ô$?Åñ#Iô#I�Kð!Ø0;ð1SÝ4EÔ4PÑ4RÔ4Rð-Ð,øå,ÔAÔNð!ð!ð!Ø×(Ò(­Ý#4Ô#Kð*Mñ*Mô*MñNôNðNà ð+*7ð*7ð*7ñ*7ô*7ð*7ð\Ô*ð ðÝ”I˜dÔ1Ñ2Ô2Ð2Ð2Ð2øðØ�D�Døøøð  ð ðy!øøøð,ñ %Ý"3Ô"CØ œJ xÔ0°$´*¸\Ô2JØ+/¬:Ð6HÔ+Ið#Kñ#Kô#K˜ð#Õ&7Ô&LÐLÐLØ Ø$ð%Ø ×,Ò,­T¸Ð-AÑ-AÔ-AÑBÔBÐBØ#$ð=*7ð*7ð*7ñ*7ô*7ð*7ð\Ô*ð ðÝ”I˜dÔ1Ñ2Ô2Ð2Ð2Ð2øðØ�D�Døøøð  ð ð]!×<Ò<Ñ>Ô>Ð>Ø ×,Ò,­T¸Ð-CÑ-CÔ-CÑDÔDÐDØ#$ðE*7ð*7ð*7ñ*7ô*7ð*7ð\Ô*ð ðÝ”I˜dÔ1Ñ2Ô2Ð2Ð2Ð2øðØ�D�Døøøð  ð õW3Øœ  8Ô,ØÔ*ÔFØñô�Fð "(¨ Ô!5�JØ×(Ò(¨°Ô)9Ñ:Ô:Ð:Ø×4Ò4Ñ6Ô6Ð6ðU*7ð*7ð*7ñ*7ô*7ð*7ð*7ð*7ð*7ð*7ð*7øøøð*7ð*7ð*7ð*7ðV"ðFÔ*ð ðÝ”I˜dÔ1Ñ2Ô2Ð2Ð2øðØ�Døøøð  ðEÔ#×BÒBÀ4Ä:ÑNÔNð *Ø /°°t´zÀ(Ô7KØ $Ô 2Ô Nð PØRVñ W� à×5Ò5Ñ7Ô7ð7ð7Ý(Ô.¨|ÀÐDÑDÔD�GØ×'Ò'Ñ)Ô)Ð)Ø×4Ò4Ñ6Ô6Ð6ð7ð7ð7ñ7ô7ð7ð7ð7ð7ð7ð7øøøð7ð7ð7ð7ðÔ)ðvÔ*ð ðÝ”I˜dÔ1Ñ2Ô2Ð2Ð2øðØ�Døøøð  ðs × +Ò +Ø(,¬ °9Ô(=Ø(,¬ °9Ô(=ð ,ñ ô ð ð ŒzÐ0Ô1ð ?à(,×(NÒ(NÈtÌzÐZbÔOcØOSÌzÐZpÔOqñ)sô)sÑ%�˜à˜d’?�?Ø9E�D”JÐ5Ñ6Ð6à×(Ò(­°WÐ)=Ñ)=Ô)=Ñ>Ô>Ð>ØŒz˜%Ô ð, Ø— ’ ‘”�‘Ø”˜IÔ&ð* Ø×,Ò,Ñ.Ô.Ð.Ñ.Ø”Ð1Ô2ð( Ø×,Ò,Ñ.Ô.Ð.Ñ.Ø”˜HÔ%ð& Ø—’Ñ!Ô!Ð!Ñ!Ø”˜IÔ&ð$ Ø× Ò Ñ"Ô"Ð"Ñ"Ø”˜GÔ$ð" Ø—’Ñ Ô Ð Ñ Ø”˜IÔ&ð Ø× Ò Ñ"Ô"Ð"Ñ"Ø”˜FÔ#ð Ø— ’ ‘”�‘Ø”˜MÔ*ð Ø×$Ò$Ñ&Ô&Ð&Ñ&Ø”˜MÔ*ð Ø×$Ò$Ñ&Ô&Ð&Ñ&Ø”Ð-Ô.ð Ø×,Ò,Ñ.Ô.ðØ œJ Ô7½6ÒAÐAØðjÔ*ð ðÝ”I˜dÔ1Ñ2Ô2Ð2Ð2Ð2øðØ�D�Døøøð  ð ùði”Ð/Ô0ð Ø×*Ò*Ñ,Ô,Ð,Ñ,Ø”Ð-Ô.ð °$´*Ð=PÔ2Qð Ø×'Ò'Ñ)Ô)Ð)Ñ)Ø”Ð,Ô-ð °´ÐÒ>¸t¼zÈ.Ô?YÐ[_Ô[eÐfqÔ[rÐtxÔt~÷uCòuCðDOñuPôuPñQôQñ Rô Rð Rð Rð RØ ŒZ˜ Ô $Ð 0°T´ZÀ Ô5LÐ5XØ × Ò ˜TÔ/×;Ò;¸D¼JÀ{Ôñ  @ô @ð @ð @ð @ð @ð @r,có8—|j ¦«dSr&)r3Úsetup_selectorr?s r*rÖzCloudlinuxSelector.run_setup¬s€Ø Ô×)Ò)Ñ+Ô+Ð+Ð+Ð+r,c óD—|€| ddi¦«|�e|j |||¦«}|}|d ¦«dkr)| |¦«t jd¦«|€|�d|j ||||¦«}|d ¦«dkr)| |¦«t jd¦«t||| | | du| duf¦«r£| �9d„|   d¦«D¦«} |j  | ¦«|j  ||||| | | | ¦«}|d ¦«dkr)| |¦«t jd¦«|�d|j  |||| ¦«}|d ¦«dkr)| |¦«t jd¦«| i¦«dS) a« Call selectorctl to change application parameter :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 main directory (application name) :param app_mode: application mode :param env_vars: dict with environment variables :param new_app_root: new application main directory (new application name) :param new_domain: new application domain :param new_app_uri: new application uri :param new_version: new version for nodejs interpreter :param startup_file: new startup file for application :param skip_web_check: skip check web application after change it's properties :param passenger_log_file: Passenger log filename :return: None Nr—zERROR: User is not specifiedÚstatusr¤rcó—g|] }|dk¯|‘Œ S)r0r‹)r�Úitems r*r�z1CloudlinuxSelector.run_change..Øs€ÐWÐWÐW¨ÈDÐTVÊJÈJ ÈJÈJÈJr,r�) r°r3ÚrelocateÚupperrºÚsysràÚtransitrUr’Úvalidate_config_file_namesÚ set_variablesÚchange_version)r@ÚuserrlÚapp_modeÚenv_varsÚ new_app_rootÚ new_domainÚ new_app_uriÚ new_versionÚ startup_fileržÚ entry_pointÚ config_filesÚpassenger_log_fileÚrs r*rzCloudlinuxSelector.run_change¯s?€ð( ˆ<Ø × Ò ØÐ8ð":ñ ;ô ;ð ;à Ð #àÔ"×+Ò+¨D°(¸LÑIÔIˆAà#ˆHØ�Œ{× Ò Ñ"Ô" dÒ*Ð*Ø× Ò  Ñ#Ô#Ð#Ý”˜‘ ” � Ø Ð " jÐ&<àÔ"×*Ò*¨4°¸;È ÑSÔSˆAØ�Œ{× Ò Ñ"Ô" dÒ*Ð*Ø× Ò  Ñ#Ô#Ð#Ý”˜‘ ” � Ý �˜( L°+¸|ÐSWÐ?WØ"¨$Ð.ð0ñ 1ô 1ð ðÐ'ØWÐW°×1CÒ1CÀCÑ1HÔ1HÐWÑWÔW� ØÔ"×=Ò=¸lÑKÔKÐKàÔ"×0Ò0°°xÀÈ8Ø1=¸{ÈLÐZlñnônˆAà�Œ{× Ò Ñ"Ô" dÒ*Ð*Ø× Ò  Ñ#Ô#Ð#Ý”˜‘ ” � Ø Ð "àÔ"×1Ò1°$¸À+È~Ñ^Ô^ˆAØ�Œ{× Ò Ñ"Ô" dÒ*Ð*Ø× Ò  Ñ#Ô#Ð#Ý”˜‘ ” � à ×Ò˜ÑÔÐÐÐr,có^—| |j ¦«¦«dSr&)rºr3rÇr?s r*rÇz*CloudlinuxSelector.run_import_applicationsés+€Ø ×Ò˜Ô+×CÒCÑEÔEÑFÔFÐFÐFÐFr,c ó^—|j |jd|jd|j dd¦«|j dd¦«¬¦«}| d¦«dvrd n| dd ¦«}| ||¬ ¦«|S) NrXrYr�Fz --dry-run)ržÚdry_runr˜r™rŸÚrollback_failedrœ)r3r³r2rsrº)r@r—Úoutcomes r*r³z*CloudlinuxSelector.run_migrate_applicationìs¬€ØÔ#×;Ò;Ø ŒJ�xÔ  $¤*¨\Ô":Øœ:Ÿ>š>Ð*<¸eÑDÔDØ”J—N’N ;°Ñ6Ô6ð<ñ8ô8ˆð!'§ ¢ ¨7Ñ 3Ô 3Ð7OÐ OÐ O�9�9ØŸ š  7Ð,=Ñ>Ô>ð à ×Ò˜¨ÐÑ0Ô0Ð0؈ r,cóÜ—|jdr.| |j ¦«¦«dS|jdr.| |j ¦«¦«dS|jdr.| |j ¦«¦«dS|jdrF| |j |jd|jd¦«¦«dS|jdtkrG| |j |j  d¦«¦«¦«dSd t¦«i}|jdtkr^|  |j  |jd¦«¦«| ¦«\}}|� |� ||d <||d <nN|jdtkr8|  |j  |jd¦«¦«d |vr| ||d ¬ ¦«dS| |¦«dS)Nz--get-default-versionz--get-selector-statusz--get-supported-versionsz--get-current-versionrXrörCrøÚpassenger_activeÚremaining_apps_countÚtotal_apps_countr—rœ)r2rºr3Úget_default_versionÚget_selector_statusÚget_supported_versionsÚget_current_versionrÚget_fullrsrrÚupdateÚget_apps_users_infoÚ_get_apps_count_from_pid_filer)r@Úresr$r%s r*r×zCloudlinuxSelector.run_getösc€Ø Œ:Ð-Ô .ð &Ø × Ò ˜TÔ/×CÒCÑEÔEÑ FÔ FÐ FÐ FÐ FØ ŒZÐ/Ô 0ð &Ø × Ò ˜TÔ/×CÒCÑEÔEÑ FÔ FÐ FÐ FÐ FØ ŒZÐ2Ô 3ð &Ø × Ò ˜TÔ/×FÒFÑHÔHÑ IÔ IÐ IÐ IÐ IØ ŒZÐ/Ô 0ð &Ø × Ò ˜TÔ/×CÒCÀDÄJÈxÔDXØDHÄJÈzÔDZñ\ô\ñ ]ô ]ð ]ð ]ð ]à ŒZ˜Ô (­CÒ /Ð /Ø × Ò ˜TÔ/×8Ò8¸¼¿ºÈ Ñ9TÔ9TÑUÔUÑ VÔ VÐ VÐ VÐ Và%Õ'<Ñ'>Ô'>Ð?ˆCØŒz˜/Ô*­fÒ4Ð4Ø— ’ ˜4Ô-×AÒAÀ$Ä*ÈXÔBVÑWÔWÑXÔXÐXà9=×9[Ò9[Ñ9]Ô9]Ñ6Ð$Ð&6Ø'Ð3Ð8HÐ8TØ2F�CÐ.Ñ/Ø.>�CÐ*Ñ+øØ”˜OÔ,µÒ6Ð6Ø— ’ ˜4Ô-×AÒAÀ$Ä*ÈXÔBVÑWÔWÑXÔXÐXؘ3ˆˆØ× Ò  ¨S°¬]Ð Ñ;Ô;Ð;Ð;Ð;à× Ò  Ñ%Ô%Ð%Ð%Ð%r,có^—| |jd¦«r%| dd|jdidœ¦«t¦«s5|jdtkrd}nd}| dd |idœ¦«| |j |jd |jd |jd|jd |jd |jd|jd|jd|jd|jd¦ « ¦«dS)Nr÷zTCan't create application: Nodejs version %(version)s is locked by background processÚversionrªrCz9https://docs.cloudlinux.com/python_selector/#installationz8https://docs.cloudlinux.com/index.html?installation.htmlz`Application creation not allowed, Phusion Passenger seems absent, please see %(url)s for detailsÚurlrYz --app-urirXrörNrTrOrùr£)Ú(_is_version_locked_by_background_processr2r°rrrºr3Ú create_app)r@r1s r*rÈzCloudlinuxSelector.run_createsU€à × 8Ò 8¸¼ÀKÔ9PÑ QÔ Qð Ø × Ò ØqØ% t¤z°+Ô'>Ð?ð"ð"ñ ô ð õ%Ñ&Ô&ð àŒz˜/Ô*­fÒ4Ð4ØQ��àP�Ø × Ò ð[ð˜3ðð"ð"ñ ô ð ð ×ÒØ Ô × )Ò )Ø” ˜<Ô(Ø” ˜;Ô'Ø” ˜;Ô'Ø” ˜8Ô$Ø” ˜:Ô&Ø” ˜<Ô(Ø” Ð+Ô,Ø” ˜<Ô(Ø” ˜?Ô+Ø” Ð1Ô2ñ ô ñ ô ð ð ð r,cóŽ—| |j |jd|jd¦«¦«dS©NrYrX)rºr3Ú destroy_appr2r?s r*rÉzCloudlinuxSelector.run_destroy5óS€Ø ×Ò˜Ô+×7Ò7¸¼ À<Ô8PØ8<¼ À8Ô8LñNôNñ Oô Oð Oð Oð Or,cóŽ—| |j |jd|jd¦«¦«dSr5)rºr3Ú start_appr2r?s r*rÊzCloudlinuxSelector.run_start9sS€Ø ×Ò˜Ô+×5Ò5°d´jÀÔ6NØ6:´jÀÔ6JñLôLñ Mô Mð Mð Mð Mr,cóŽ—| |j |jd|jd¦«¦«dSr5)rºr3Ú restart_appr2r?s r*rËzCloudlinuxSelector.run_restart=r7r,cóŽ—| |j |jd|jd¦«¦«dSr5)rºr3Ústop_appr2r?s r*rÌzCloudlinuxSelector.run_stopAsS€Ø ×Ò˜Ô+×4Ò4°T´ZÀ Ô5MØ59´ZÀÔ5IñKôKñ Lô Lð Lð Lð Lr,có¦—| |j |jd|jd|jd¦«¦«dS)NrYú --config-filerX)rºr3Úread_app_configr2r?s r*rÍz"CloudlinuxSelector.run_read_configEsX€Ø ×ÒØ Ô × .Ò .Ø” ˜<Ô(Ø” ˜?Ô+Ø” ˜8Ô$ñ &ô &ñ 'ô 'ð 'ð 'ð 'r,c ó¾—| |j |jd|jd|jd|jd¦«¦«dS)NrYr?z --contentrX)rºr3Úsave_app_configr2r?s r*rÎz"CloudlinuxSelector.run_save_configLsb€Ø ×ÒØ Ô × .Ò .Ø” ˜<Ô(Ø” ˜?Ô+Ø” ˜;Ô'Ø” ˜8Ô$ñ  &ô &ñ 'ô 'ð 'ð 'ð 'r,c óÌ—|j |jd|jd|jd|jd|jd| |jd¦«|j|j¬¦«}| |¦«t|t¦«o8t|  dd ¦«¦«  ¦«d k S) NrYrXrör�z--requirements-fileú --modules)rÚdomainržÚ spec_fileÚmodulesÚbefore_installÚ after_installrr0Úok) r3Úinstall_modulesr2r”rvrxrºrçr»rÜrsÚlower)r@r—s r*rÏz&CloudlinuxSelector.run_install_modulesTsØ€ØÔ#×3Ò3Ø ŒJ�|Ô $Ø”˜HÔ%Ø”:˜jÔ)Øœ:Ð&8Ô9Ø”jÐ!6Ô7Ø×&Ò& t¤z°+Ô'>Ñ?Ô?ØÔLØÔEð4ñ  ô  ˆð ×Ò˜Ñ Ô Ð õ˜v¥tÑ,Ô,ðFݘFŸJšJ x°Ñ4Ô4Ñ5Ô5×;Ò;Ñ=Ô=ÀÒEðGð Gr,c óþ—| |j |jd| |jd¦«|jd|jd|jd¬¦«¦«dS)NrYrDrXrör�)rGrrErž)rºr3Úuninstall_modulesr2r”r?s r*rÐz(CloudlinuxSelector.run_uninstall_modulesfs€€Ø ×ÒØ Ô × 0Ò 0Ø” ˜<Ô(Ø×*Ò*¨4¬:°kÔ+BÑCÔCØ”Z Ô)Ø”z *Ô-Ø#œzÐ*<Ô=ð 1ñ ô ñ ô ð ð ð r,có—|jd}|jd} | |j ||¦«¦«dS#t$r/}| dt |¦«i¦«Yd}~dSd}~wwxYw)zM Disable or enable interpreter version :return: None r÷r¨r—N)r2rºr3Úset_version_statusrr°rÜ)r@r0Útarget_version_statusrps r*rÒz0CloudlinuxSelector.run_disable_or_enable_versionqs·€ð ”*˜[Ô)ˆØ $¤ Ð+;Ô <Ðð Ø × Ò ˜TÔ/×BÒBÐCXÐZaÑbÔbÑ cÔ cÐ cÐ cÐ cøÝ ð ð ð Ø × Ò Ø�#˜a™&œ&ð"ñ ô ð ð ð ð ð ð ð øøøøð øøøsœ.A Á BÁ$BÂBcóä—t|jd¦«} |jdr |jj |¦«}n|jj |¦«}n&#t $r}t|¦«}Yd}~nd}~wwxYw|€| t¦«dSt|t¦«r|  |¦«dS|  d|i¦«dS)Nr÷r§r—) rÜr2r3Úselector_managerÚinstall_versionÚuninstall_versionrârºr"rçr»r°)r@Úverr.rps r*rÑz%CloudlinuxSelector.run_manage_version€sþ€Ý�$”*˜[Ô)Ñ*Ô*ˆð ØŒzÐ+Ô,ð QØÔ(Ô9×IÒIÈ#ÑNÔN��àÔ(Ô9×KÒKÈCÑPÔP�øøÝð ð ð Ý�a‘&”&ˆCˆCˆCˆCˆCˆCøøøøð øøøà ˆ;Ø × Ò �[Ñ )Ô )Ð )Ð )Ð )Ý ˜�TÑ "Ô "ð 2Ø × Ò  Ñ %Ô %Ð %Ð %Ð %à × Ò  (¨C Ñ 1Ô 1Ð 1Ð 1Ð 1sœA A)Á) B Á3BÂB c ód—t||j|j¬¦«\}}|s"| t |¦«¦«|ddkrÅ|drX t ¦«}| |d¦«n-#t j$rtdd|didœ¦«‚wxYwd}|d rT tj |d|d ¦«\}}|r||d<t|d |¬ ¦«}n#t$rYnwxYw||d <|Stj  d ¦«s9|d s|dr)|dtkr| dddœ¦«tj |d|d ¦«\|d<}dD]™} | | ¦«sŒt#|d|| ¦«\}} t%j| ¦«nG#t($r:} | t+t-| ¦«¬¦«¦«Yd} ~ nd} ~ wwxYw| || <Œš|S)z% Parse CLI arguments )Ú as_from_rootrCÚphprXzNo such user (%s)r)rßr«Nrö)rEÚdocrootrøz/usr/local/cpanelr¦rIrŸz?Import/migrate of Python Selector applications is not supported)r—Úwarning)rYrPrœ)r r1r6r°rrÚget_pw_by_nameÚNoSuchUserExceptionr#r!Ú$safely_resolve_username_and_doc_rootr$r4r<Úisdirrrsrr Úcheck_directoryÚ ValueErrorr»rÜ) r@rérÚdataÚpwdÚwebsiteÚ resolved_userÚdoc_rootrmÚ app_root_argÚ directoryrps r*r±zCloudlinuxSelector._parse_args�sö€õ6Ø �$”-¨dÔ.@ðBñBôB‰ ˆ�àð 7à × Ò ¥°Ñ!5Ô!5Ñ 6Ô 6Ð 6ð �Ô  EÒ )Ð )Ø�HŒ~ð ð Ý™'œ'�CØ×&Ò& t¨H¤~Ñ6Ô6Ð6Ð6øÝÔ0ðððÝ(à':à &¨¨X¬ð(ððñôððøøøðˆGØ�JÔð ð Ý.CÔ.hؘXœ¨¨ZÔ(8ñ/:ô/:Ñ+�M 8ð%ð7Ø)6˜˜X™Ý%¨T°*Ô-=ÀxÐPÑPÔP�G�GøÝ%ðððà�Dðøøøð!(ˆD�Ñ ØˆKõ ”— ’ Ð1Ñ2Ô2ð qØÐ/Ô0ð qà˜iœð qà-1°/Ô-BÅfÒ-LÐ-LØ × Ò ¨IØ-nð"pð"pñ qô qð qõ2ÔVØ �ŒN˜D Ô,ñ.ô.шˆX‰˜ð =ð +ð +ˆLØ—8’8˜LÑ)Ô)ð Øå& t¨H¤~°t¸LÔ7IÑJÔJ‰LˆAˆyð õÔ+¨IÑ6Ô6Ð6Ð6øÝð ð ð Ø×$Ò$¥Tݘq™6œ6ð&ñ&ô&ñôððððððøøøøð øøøð"+ˆD�Ñ Ð Øˆ s7Á)BÂ*B-Â;AC>Ã> D Ä D ÇG#Ç# H'Ç-0H"È"H'rcóŒ—d|vr|d|d<|d=|jr9| dtj¦«i¦«t|d¦«n] t t |d¦«| di¦«z¦«n"#t$rt d|z¦«YnwxYwtj |¦«dS)zŠ Print error and exit :param dict message: Dictionary with keys "result" as string and optional "context" as dict rr—Ú timestampTr«z Error: %sN) r1r+ÚtimerÚprintrÜrsr�r rà)r@rßÚ error_codes r*r°z"CloudlinuxSelector._error_and_exitÛsà€ð �wÐ Ð Ø '¨Ô 1ˆG�HÑ Ø˜Ð!Ø Œ=ð -Ø �NŠN˜K­¬©¬Ð5Ñ 6Ô 6Ð 6Ý ˜W dÑ +Ô +Ð +Ð +ð -Ý•c˜' (Ô+Ñ,Ô,¨w¯{ª{¸9ÀbÑ/IÔ/IÑIÑJÔJÐJÐJøÝð -ð -ð -Ý�k GÑ+Ñ,Ô,Ð,Ð,Ð,ð -øøøå Œ�ÑÔÐÐÐsÁ9BÂB-Â,B-có$—t|¦«dS)z– Print raw data. Function should be used in case if you want to print a json string as an output from other utilities N)rl)rbs r*rÀz"CloudlinuxSelector._print_raw_dataís€õ ˆd‰ Œ ˆ ˆ ˆ r,rŸcó,—t|t¦«rç| ¦«}d|vr#t|dt¦«r|d}| d|¦«|d ¦«dkr:d|d<|jdt kr|j ¦«rd|d<nd|vrd|vr |d|d<|d=|  d tj ¦«i¦«t||j p|¦«d S) z› Output data wrapper :param: `dict` data - data for output to stdout :param: `bool` force_json - always output json format rbrrJrŸr—rCzbMultiPHP system default PHP version is alt-php. PHP Selector does not work and should be disabled!r[rjN) rçr»ÚcopyÚ setdefaultrLr2rr3Úcheck_multiphp_system_defaultr+rkrr1)r@rbÚ force_jsonr—s r*rºzCloudlinuxSelector._print_dataøs€õ �d�DÑ !Ô !ð 4Ø—9’9‘;”;ˆDà˜ˆ~ˆ~¥*¨T°&¬\½4Ñ"@Ô"@ˆ~ؘF”|�à �OŠO˜H fÑ -Ô -Ð -ð�HŒ~×#Ò#Ñ%Ô%¨Ò-Ð-Ø!*��X‘Ø”:˜oÔ.µ#Ò5Ð5¸$Ô:L×:jÒ:jÑ:lÔ:lÐ5ð'[�D˜‘Oøð Ð%Ð%¨(°dÐ*:Ð*:Ø!% h¤��X‘Ø�X�à �KŠK˜¥d¤i¡k¤kÐ2Ñ 3Ô 3Ð 3ݘ˜tœ}Ð:° Ñ;Ô;Ð;Ð;Ð;r,cóR—|jd ¦«tkS©NrC)r2rLrr?s r*rzCloudlinuxSelector._is_nodejsó €àŒz˜/Ô*×0Ò0Ñ2Ô2µfÒ<ÐÐØ Ð2Ð 2Ð 2Ø × Ò ØuØ% zÐ2ð"ð"ñ ô ð ð Ô*ð \¨t×/ZÒ/ZÑ/\Ô/\ð \Ø × Ò  (Ð,YÐ!ZÑ [Ô [Ð [ؘZÐ'Ð'r,cóÆ—| ¦«\}}|jsr|jjdddd|zd|z|jg}t j|t jt jt jdd¬¦«| t¦«dS|  |¦«\}}|r|d krdS|  |||¦«|  |||¦«dS) zM Change all applications all users versions :return: rDr–z--interpreter=nodejsz--from-version=%sz--new-version=%sT)ÚstdinÚstdoutÚstderrÚ close_fdsÚstart_new_sessionNr) rŽr9r3r¿r:rÂrÃÚDEVNULLrºr"Ú_get_all_apps_by_versionÚ_write_pid_fileÚ_move_apps_by_list)r@r†r‡ÚcmdÚusers_apps_listr%s r*rÔz2CloudlinuxSelector._start_change_all_apps_versionsxs€ð $(×#HÒ#HÑ#JÔ#JÑ ˆ �jàÔ*ð ðÔ"Ô>Ø)¨8Ø&Ø# lÑ2Ø" ZÑ/ØÔ ð ˆCõ Ô ØÝ Ô(Ý!Ô)Ý!Ô)ØØ"&ð  ñ ô ð ð × Ò �[Ñ )Ô )Ð )Ø ˆFð-1×,IÒ,IÈ,Ñ,WÔ,WÑ)ˆÐ)àð Ð"2°aÒ"7Ð"7Ø ˆFà ×Ò˜\¨:Ð7GÑHÔHÐHà ×Ò °Ð=MÑNÔNÐNÐNÐNr,c ó—t|¦«D]|\}}|D]t}|jjdddtd|d|d|g }t j|¦«}| ¦«|dz}| |¦«tj d¦«ŒuŒ}d S) a‚ Move applications from list from one NodeJS version to another :type dict :param apps_dict: Application list. List example: {'cltest1': [u'modjsapp_root'], 'cltest2': [u'app2', u'main_app']} :param to_version: Move applications to this version :param total_apps_count: Total applications count for move :return: None r¥r–rCrXrYrSréN) rr3r¿rrÂrÃrÄÚ_change_pid_filerkÚsleep) r@Ú apps_dictr‡r%Ú user_nameÚ user_app_listrlr™rïs r*r˜z%CloudlinuxSelector._move_apps_by_list©s¸€õ)2°)Ñ(<Ô(<ð ð Ñ $ˆI�}Ø)ð ð �àÔ*ÔFÈÈxÐYhÕjpØ  )¨\¸8À_ÐV`ðc�å$Ô*¨3Ñ/Ô/�Ø×#Ò#Ñ%Ô%Ð%Ø  AÑ%Ð à×%Ò%Ð&6Ñ7Ô7Ð7Ý” ˜2‘”��ð ð ð r,cóÆ—tt¦«}|jj ¦«}d}t |¦«D]š\}} |jj |j|j|j ¦«}t |¦«D]1\}} | d|kr ||  |¦«|dz }Œ2Œx#ttttf$rYŒ—wxYw||fS)aB Retrives list of all NodeJS applications for all users, which uses supplied version of NodeJS :param from_version: Required NodeJS version :return: Cortege: (application_list, application_count). Example: ({'cltest1': [u'modjsapp_root'], 'cltest2': [u'app2', u'main_app']}, 3) rÚnodejs_versionr)rrèr3r]Úget_users_dictrÚread_user_selector_config_jsonÚpw_dirÚpw_uidÚpw_gidÚappendrÚ TypeErrorr�ÚAttributeError) r@r†Úusers_apps_dictÚ user_infor%r Ú user_pw_entryÚ user_app_datarlÚapp_infos r*r–z+CloudlinuxSelector._get_all_apps_by_version¿s€õ&¥dÑ+Ô+ˆàÔ&Ô3×BÒBÑDÔDˆ ØÐÝ(1°)Ñ(<Ô(<ð ð Ñ $ˆI�}ð Ø $Ô 2Ô ?× ^Ò ^Ø!Ô(Ø!Ô(Ø!Ô(ñ!ô!� õ+4°MÑ*BÔ*Bð.ð.Ñ&�H˜hàÐ 0Ô1°\ÒAÐAØ'¨ Ô2×9Ò9¸(ÑCÔCÐCØ(¨AÑ-Ð(øð .øõ &¥yµ(½NÐKð ð ð à�ð øøøðÐ 0Ð0Ð0sÁ A1B<Â<CÃCcó‚— tjt|jd¦«¦«}|d|_dS#YnxYwdS)z] Determine is background process already working :return: True|False rr†TF)ÚjsonÚloadr+r>r;)r@rbs r*r‹z9CloudlinuxSelector._is_background_process_already_runningßsH€ð  Ý”9�U 4Ô#6¸Ñ<Ô<Ñ=Ô=ˆDØ%)¨.Ô%9ˆDÔ "Ø�4øð Ø ˆDøøøàˆus‚48¸<cóä—|jdtkrdS|j |¦«}|j |¦«}| ¦«}|r ||jkrdSdS)z» Checks if NodeJS version blocked by background operation :param nj_version: NodeJS version to check :return: True - version is locked, False - not locked rCFT)r2rr3Úresolve_versionr„r‹r;)r@Ú nj_versionÚis_bkg_process_presents r*r2z;CloudlinuxSelector._is_version_locked_by_background_processísx€ð Œ:�oÔ &­&Ò 0Ð 0Ø�5àÔ'×7Ò7¸ ÑCÔCˆ ØÔ'×DÒDÀZÑPÔPˆ Ø!%×!LÒ!LÑ!NÔ!NÐØ !ð  j°DÔ4JÒ&JÐ&JØ�4؈ur,c ó*—tjtj¦«t |¦«t |¦«||t t j¦«¦«dœt|jd¦«¦«tj |jd¦«dS)a Creates pid file for background process move version from version to version :param from_version: Move from NJ version :param to_version: Move to NJ version :param total_apps_count: Total application count to move :return: None )Úpidr†r‡r%r$rkÚwé¤N) r²Údumpr4ÚgetpidrÜÚfloatrkr+r>Úchmod)r@r†r‡r%s r*r—z"CloudlinuxSelector._write_pid_fileýs…€õ Œ Ý”9‘;”;Ý  Ñ-Ô-ݘj™/œ/Ø 0Ø$4Ý�$œ)™+œ+Ñ&Ô&ð  ð õ �Ô$ cÑ *Ô *ñ ,ô ,ð ,õ Œ�Ô$ eÑ,Ô,Ð,Ð,Ð,r,có€—t|jd¦«}tj|¦«}| ¦«|S)zc Reads pid file and returns it's content as dictionary :return: Dictionary r)r+r>r²r³Úclose©r@ÚfÚpid_datas r*Ú_read_pid_filez!CloudlinuxSelector._read_pid_files5€õ �$Ô% sÑ +Ô +ˆÝ”9˜Q‘<”<ˆØ �Љ Œ ˆ ؈r,cóT— | ¦«}||d<tt¬¦«\}}tj|t |d¦«¦«t j||j¦«t j |jd¦«dS#tttf$rYdSwxYw)z½ Creates pid file for background process move version from version to version :param remaining_apps_count: Remaining application count to move :return: None r$)Údirrºr»N) rÅrrr²r¼r+r4Úrenamer>r¿ÚOSErrorrfr�)r@r$rÄrmÚtemp_file_names r*r�z#CloudlinuxSelector._change_pid_files­€ð Ø×*Ò*Ñ,Ô,ˆHØ/CˆHÐ+Ñ ,å '­JÐ 7Ñ 7Ô 7Ñ ˆAˆ~Ý ŒI�h¥ n°cÑ :Ô :Ñ ;Ô ;Ð ;Ý ŒI�n dÔ&9Ñ :Ô :Ð :å ŒH�TÔ(¨%Ñ 0Ô 0Ð 0Ð 0Ð 0øÝ�¥(Ð+ð ð ð Ø ˆ6ˆ6ð øøøs‚BB  B'Â&B'cóÚ— t|jd¦«}tj|¦«}| ¦«|d|dfS#t t tf$rYdSwxYw)z¿ Retrieves application counts from pid file :return: Cortege (remaining_apps_count, total_apps_count) If no background process started, returns None, None rr$r%)NN)r+r>r²r³rÁrÉrfr�rÂs r*r-z0CloudlinuxSelector._get_apps_count_from_pid_file,ss€ð  Ý�dÔ)¨3Ñ/Ô/ˆAÝ”y ‘|”|ˆHØ �GŠG‰IŒIˆIØÐ2Ô3°XÐ>PÔ5QÐQÐ QøÝ�¥(Ð+ð ð ð Ø�:�:ð øøøs‚A AÁA*Á)A*cóÄ—t¦«}| |¦«} t|¦«sdStj |¦«rdS| tjj¦«s tj ||¦«}tj  |¦«}| |tjz¦«rQtj  |¦«}tj  |¦«st|¦«d|fSn2#ttf$r}dt|¦«zdfcYd}~Sd}~wwxYwdS)a™ Validates passenger log file name :param username: User's name :param log_filename: passenger log file name to validate :return: tuple: (message, log_filename). message: "OK" - filename is valid, any other string - invalid, error text log_filename: corrected log filename - simlink dereferencing, appends user's homedir for relative paths, etc )zAERROR: Passenger log filename should contain only english lettersN)zDERROR: Passenger log file should be a filename, not a directory nameNr¤z%sN)z9ERROR: Passenger log file should be placed in user's homeN)rÚ get_homedirr r4r<r_Ú startswithÚsepr=ÚrealpathÚdirnamer_rrÉrfrÜ)rkrðrcÚ user_homedirÚ log_realpathrÑÚexcs r*rÅz4CloudlinuxSelector._passenger_log_filename_validator:sP€õ‰gŒgˆØ—’ xÑ0Ô0ˆ ð )Ý" <Ñ0Ô0ð aØ`Ð`ÝŒw�}Š}˜\Ñ*Ô*ð dØcÐcØ×*Ò*­2¬7¬;Ñ7Ô7ð HÝ!œwŸ|š|¨L¸,ÑGÔG� Ýœ7×+Ò+¨LÑ9Ô9ˆLØ×&Ò& |µB´FÑ':Ñ;Ô;ð *Ýœ'Ÿ/š/¨,Ñ7Ô7�Ý”w—~’~ gÑ.Ô.ð%ݘGÑ$Ô$Ð$ؘ\Ð)Ð)ð  *øõ �Ð!ð )ð )ð )Ø�#˜c™(œ(‘? DÐ(Ð (Ð (Ð (Ð (Ð (Ð (øøøøð )øøøàPÐPs)¥D.¶D.ÁCD.Ä.EÄ?EÅEÅEN)FF)r)FrŸ):Ú__name__Ú __module__Ú __qualname__rArVrqrvrxr{rzÚ staticmethodr”rôrÆrÖrrÇr³r×rÈrÉrÊrËrÌrÍrÎrÏrÐrÒrÑr±r°rÀrºÚpropertyrrÚreÚcompilerzÚ classmethodr}rÚ contextlibÚcontextmanagerrµrˆrŽrÔr˜r–r‹r2r—rÅr�r-rÅr‹r,r*r.r.BsŒ€€€€€ð Vð Vð Vðððð@%*Ø$)ð8ð8ð8ð8ð@ððð60ð0ð0ð%ð%ð%ðððð@ðSðSñ„\ðSð sðsðsðj@ð@ð@ð6,ð,ð,ð8ð8ð8ðtGðGðGðððð&ð&ð&ð8!ð!ð!ðFOðOðOðMðMðMðOðOðOðLðLðLð'ð'ð'ð'ð'ð'ðGðGðGð$  ð  ð  ð ð ð ð2ð2ð2ð IðIðIðVðððð$ððñ„\ðð<ð<ð<ð<ð:ð=ð=ñ„Xð=ðð=ð=ñ„Xð=ð#˜œ Ð#BÑCÔCÐàðWðWñ„[ðWððððÔððñÔðð0(ð(ð(ð8(ð(ð(ð$/Oð/Oð/Oðbððð,1ð1ð1ð@ ð ð ðððð -ð-ð-ð&ðððððð$ ð ð ððQðQñ„\ðQðQðQr,r.)IÚ __future__rrrrarÚr rkrgÚclcommon.cpapir}rÝr²r4rÂrãÚtypingrÚ future.utilsrÚclcommonrÚclcommon.clexceptionr Úclcommon.mail_helperr Úclcommon.clfuncr Ú cllicenser Úclselectr Úclselect.utilsrrrÚclselect.baseclselectrrÚ cli_utilsrrÚclselect.clselectnodejsrÚ"clselect.clselectnodejs.pkgmanagerrÚ clselector.clpassenger_detectlibrÚ collectionsrÚemail.mime.textrÚtempfilerr0rÚcl_selector_arg_parserrrr Ú selectorlibr!r"r#Úclselect.modelsr$Úclselect.clselectexceptrØr`r+Úobjectr.r‹r,r*úr÷sÞðð&Ð%Ð%Ð%Ð%Ð%Ø&Ð&Ð&Ð&Ð&Ð&ØÐÐÐÐÐØ € € € Ø € € € Ø € € € Ø € € € Ø € € € àÐÐÐÐÐØÐÐÐØ € € € Ø € € € ØÐÐÐØÐÐÐàÐÐÐÐÐØ"Ð"Ð"Ð"Ð"Ð"àÐÐÐÐÐØ3Ð3Ð3Ð3Ð3Ð3Ø+Ð+Ð+Ð+Ð+Ð+Ø+Ð+Ð+Ð+Ð+Ð+Ø*Ð*Ð*Ð*Ð*Ð*à Ð Ð Ð Ð Ð àFÐFÐFÐFÐFÐFÐFÐFÐFÐFàPÐPÐPÐPÐPÐPÐPÐPØ6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ø.Ð.Ð.Ð.Ð.Ð.Ø9Ð9Ð9Ð9Ð9Ð9ØBÐBÐBÐBÐBÐBØ#Ð#Ð#Ð#Ð#Ð#Ø$Ð$Ð$Ð$Ð$Ð$ØÐÐÐÐÐàÐÐÐÐÐØ6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6ØAÐAÐAÐAÐAÐAØKÐKÐKÐKÐKÐKÐKÐKÐKÐKØ#Ð#Ð#Ð#Ð#Ð#àHÐHÐHÐHÐHÐHð€ð!ð!ð!ðSQðSQðSQðSQðSQ˜ñSQôSQðSQðSQðSQr,