§ WèÄj�1ãó—dZddlZddlZddlZddlZddlZddlZddlZddlm Z ddl m Z ddl m Z  ddlmZn#e$rd„ZYnwxYwdd lmZdd lmZdd lmZdd lmZejd ¦«ZdZdZdZdefd„ZGd„d¦«Z dS)zG This module contains a wrapper around `clwpos-user get` local utility éN)ÚOptional©Úbuild_clwpos_user_cmd)ÚCloudlinuxSummary)Úis_wpos_visiblecó—dS)N©©Úusernames úN/opt/cloudlinux/venv/lib64/python3.11/site-packages/xray/adviser/clwpos_get.pyúr s€ t€óé)Ú get_client)ÚNginxUserCache)Úget_plugin_status)Úany_suite_allowed_on_serverÚ clwpos_utili€éxéÈÚreturncó€—|€dnt|¦«}t|¦«tkr|S|dt…dzS)zLReturn a bounded, redaction-marked snippet of subprocess output for logging.NÚz...[truncated])ÚstrÚlenÚ_CLWPOS_LOG_SNIPPET_MAX)ÚoutputÚtexts r Ú _log_snippetr4sD€à�ˆ2ˆ2¥S¨¡[¤[€DÝ ˆ4�y„yÕ+Ò+Ð+؈ Ø Ð(Õ(Ð(Ô )Ð,<Ñ <ÐÔ >Ð >Ø�4�4�4�4�4øøøøð øøøð ð Ý �LŠLÐWØœÕ$Añ Cô Cð Cà�4à ˜Š?ˆ?Ý �LŠLÐXØœ Jµ ¸VÑ0DÔ0Dñ Fô Fð Fà�4ð Ý”:˜fŸlšl™nœnÑ-Ô-Ð -øÝÔ#ð ð ð Ý �LŠLÐSØœ¥L°Ñ$8Ô$8ñ :ô :ð :à�4�4ð øøøsA®AÁ A<Á"A7Á7A<ÂBÂC"Â6!CÃC"Å%E-Å-=F.Æ-F.Úcmdcó—tj¦«tz}tj|tjtjd¬¦«}t¦«}d} |j}|€J‚ |tj¦«z }|dkrtj |t¦«‚tj |ggg|¦«\}}}|stj |t¦«‚tj |  ¦«d¦«} | snAt|¦«t| ¦«ztkrd}n| | ¦«ŒÙ|r€d|jdf| ¦«€| ¦« | d¬ ¦«n#tj $rYnwxYw|j�|j ¦«SS| t-d |tj¦«z ¦«¬ ¦«} | ¦«€| ¦« | d¬ ¦«n#tj $rYnwxYw|j�|j ¦«n{#| ¦«€| ¦« | d¬ ¦«n#tj $rYnwxYw|j�|j ¦«wwxYw| d d ¬ ¦«| dfS)u£Run ``cmd`` capping stdout at ``_CLWPOS_SCAN_MAX_OUTPUT_BYTES`` and wall-clock time at ``_CLWPOS_SCAN_TIMEOUT`` seconds. Returns ``(stdout, returncode, overflow)`` where ``stdout`` is decoded text. On overflow the child is killed and ``overflow`` is True so the caller refuses to parse the partial/oversized payload. On timeout the child is killed and ``subprocess.TimeoutExpired`` is raised, reusing the existing SubprocessError failure path. Cleanup is in an explicit ``finally`` rather than ``with proc:`` on purpose: ``Popen.__exit__`` performs a blocking ``wait()`` with no timeout, so a child that hangs without closing its stdout would stall there forever — defeating the wall-clock cap. We always kill a still-running child BEFORE any wait, and every wait is itself bounded, so no exit path can block indefinitely. r)rEÚstderrÚbufsizeFNTiré)Útimeoutgzutf-8Úreplace)Úerrors)ÚtimeÚ monotonicÚ_CLWPOS_SCAN_TIMEOUTr<ÚPopenÚPIPEÚDEVNULLÚ bytearrayrEÚTimeoutExpiredÚselectr5ÚreadÚfilenorr>ÚextendrFÚpollÚkillÚwaitÚcloseÚmaxÚdecode) rIÚdeadlineÚprocÚbufrGrEÚ remainingÚreadableÚ_ÚchunkrFs r r:zClWposGetter._run_scan_bounded…s€õ$”>Ñ#Ô#Õ&:Ñ:ˆÝÔ ­J¬OÝ(2Ô(:ÀAðGñGôGˆå‰kŒkˆØˆð& $Ø”[ˆFØÐ%Ð%Ð%ð "Ø$¥t¤~Ñ'7Ô'7Ñ7� Ø ’>�>Ý$Ô3°CÕ9MÑNÔNÐNõ"(¤°¨x¸¸RÀÑ!KÔ!K‘�˜!˜QØðOÝ$Ô3°CÕ9MÑNÔNÐNõœ § ¢ ¡¤°Ñ7Ô7�ØðØÝ�s‘8”8�c %™jœjÑ(Õ+HÒHÐHØ#�HØØ— ’ ˜5Ñ!Ô!Ð!ð# "ð$ð 1à˜4œ?¨DÐ0ð�yŠy‰{Œ{Ð"Ø— ’ ‘ ” � ð à— ’  !� Ñ$Ô$Ð$Ð$øÝÔ,ð ð ð Ø�ð øøøàŒ{Ð&Ø” ×!Ò!Ñ#Ô#Ð#Ð#ð'🚭3¨s°H½t¼~Ñ?OÔ?OÑ4OÑ+PÔ+P˜ÑQÔQˆJð�yŠy‰{Œ{Ð"Ø— ’ ‘ ” � ð à— ’  !� Ñ$Ô$Ð$Ð$øÝÔ,ð ð ð Ø�ð øøøàŒ{Ð&Ø” ×!Ò!Ñ#Ô#Ð#øøð�yŠy‰{Œ{Ð"Ø— ’ ‘ ” � ð à— ’  !� Ñ$Ô$Ð$Ð$øÝÔ,ð ð ð Ø�ð øøøàŒ{Ð&Ø” ×!Ò!Ñ#Ô#Ð#Ð#ð'øøøà�zŠz˜'¨)ˆzÑ4Ô4°jÀ%ÐGÐGs[ÁC0I.Å2F Æ FÆFÇ8I.È!H8È8I É I É.)K&ÊJ/Ê.K&Ê/KÊ>K&ËKË%K&có(‡‡‡—ˆˆˆfd„|D¦«S)zp Iterate through advices and return only those which relate to current user-domain-site c󀕗g|]:}|dd‰kr&|dd‰kr|dd‰k¯8|‘Œ;S)Úmetadatar r"Úwebsiter )Ú.0Úadvicer"Úuserrms €€€r ú z8ClWposGetter.get_advices_for_website..Ësdø€ð ð ð àØ�jÔ! *Ô-°Ò5Ð5Ø�jÔ! (Ô+¨vÒ5Ð5Ø�jÔ! )Ô,°Ò7Ð7ð ð8Ð7Ð7rr )Úadvicesrpr"rms ```r Úget_advices_for_websitez$ClWposGetter.get_advices_for_websiteÅs:øøø€ð  ð ð ð ð ð à!ð ñ ô ð rcó6—i}| ||¦«}|s|Sg}|d ¦«D]ß\}}d|›�} |d |g¦«} | |||| ¦«} t ||| | | ¦«} | t | | | ¬¦«¦«nN#t$rAt  d¦«| t | | ¬¦«¦«YnwxYw||||  ¦«dœ}Œà|S)zP For getting extended metadata which will be sent daily by cron Úissuesú/)r6ruÚwp_plugin_statusz)Getting Smart Advice plugin status failed©r6ru©r r"ÚwebsitesÚserver_load_rate) rHÚitemsÚgetrsrÚappendÚdictÚ Exceptionr%Ú exceptionr{) r+r r"Úcurrent_advicesÚfinal_metadataÚwebsites_metadatarzÚsiterur6Úwebsite_issuesÚadvice_for_websiteÚsmart_advice_plugin_statuss r Úget_updated_extended_metadataz*ClWposGetter.get_updated_extended_metadataÓs�€ðˆØ ŸLšL¨°6Ñ:Ô:Ðà ð "Ø!Ð !àˆØ-¨hÔ7×=Ò=Ñ?Ô?ð ð ‰LˆD�&Ø�t�:�:ˆDØ.¨xÔ8×<Ò<¸TÀ2ÑFÔFˆNØ!%×!=Ò!=¸oÈxÐY_ÐaeÑ!fÔ!fÐ ð SÝ->¸xØHNØHLØHVØHZñ .\ô.\Ð*ð—’¥¨$Ø,:Ø6Pð!Rñ!Rô!RñSôSðSðSøõ ð =ð =ð =Ý× Ò Ð!LÑMÔMÐMØ—’¥¨$Ø,:ð!<ñ!<ô!<ñ=ô=ð=ð=ð=ð =øøøð%Ø Ø$Ø$(×$9Ò$9Ñ$;Ô$;ð ðˆNˆNð ÐsÁ8B1Â1AC<Ã;C<c󶇗d}| ||¦«Š‰�=||ˆfd„‰d ¦«D¦«| ¦«dœ}|S)zX Ensure format accepted by Smart Advice POST requests/metadata endpoint Nc ór•—g|]3\}}td|›�‰d |g¦«¬¦«‘Œ4S)rvrurx)rr})rnr…ruÚdatas €r rqz3ClWposGetter.construct_metadata..s^ø€ð!#ð!#ð!#á%1 T¨6õ"&¨:¨t¨:¨:Ø-1°(¬^×-?Ò-?ÀÀbÑ-IÔ-Ið"Kñ"Kô"Kð!#ð!#ð!#rrury)rHr|r{)r+r r0Ú dummy_resultrŒs @r r'zClWposGetter.construct_metadataús†ø€ðˆ à�|Š|˜H jÑ1Ô1ˆà Ð Ø(0Ø&0ð!#ð!#ð!#ð!#à59¸(´^×5IÒ5IÑ5KÔ5Kð!#ñ!#ô!#ð15×0EÒ0EÑ0GÔ0GðIðIˆLðÐrcóà— tj¦«}n@#t$r3}t dt |¦«¦«Yd}~dSd}~wwxYwt j¦«pd}||z S)rz%Unable to get domains_total stats: %sNgð¿gð?)rÚ_get_total_domains_amountr€r%r*rÚmultiprocessingÚ cpu_count)Ú domains_totalrDr‘s r r{zClWposGetter.server_load_rate s~€ð Ý-ÔGÑIÔIˆMˆMøÝð ð ð å �LŠLÐ@Å#ÀaÁ&Ä&Ñ IÔ IÐ IØ�4�4�4�4�4øøøøð øøøõ $Ô-Ñ/Ô/Ð6°3ˆ ؘyÑ(Ð(s‚– A (AÁAÚstatcót—|dr/td¦«}|¦« |¬¦«dSdS)zo Send gathered metadata to adviser miscroservice. Ignore sending if websites are empty rzÚadviser)rŒN)rÚ send_stat)r“Úclients r r)zClWposGetter.sendsK€ð � Ô ð *Ý  Ñ*Ô*ˆFØ ˆF‰HŒH× Ò  DÐ Ñ )Ô )Ð )Ð )Ð )ð *ð *rcó`—t¦«stj|jdgd¬¦«dSdS)z„ Needed to save PHP info to work without clwpos_monitoring demon when AccelerateWP is turned off completely z--forceT)Úcapture_outputN)rr<ÚrunÚawp_info_collector)r+s r Úsave_clwpos_infozClWposGetter.save_clwpos_info&sC€õ +Ñ,Ô,ð VÝ ŒN˜DÔ3°YÐ?ÐPTÐ UÑ UÔ UÐ UÐ UÐ Uð Vð Vr)Ú__name__Ú __module__Ú __qualname__r8r›rr-Ú staticmethodÚboolr$Úlistr3rrrHr:rsr‰r'Úfloatr{r)rœr rr r!r!<sÅ€€€€€Ø !€DØBÐð c cð c°3ð c¸4ð cð cð cð cðð3 sð3¨tð3ð3ð3ñ„\ð3ð R 3ðR°CðR¸DðRðRðRðRð, ð,°ð,¸À$¼ð,ð,ð,ð,ð\ð=H˜tð=Hð=Hð=Hñ„\ð=Hð~ð  ð  ñ„\ð  ð%ð%ð%ðN¨3ð¸CðÀDððððð&ð )˜eð )ð )ð )ñ„\ð )ðð*�4ð*˜Dð*ð*ð*ñ„\ð*ðVðVðVðVðVrr!)!Ú__doc__r?Úloggingr5rYr<rQr�ÚtypingrÚxray.internal.utilsrÚclsummary.summaryrÚ clwpos.papirÚ ImportErrorÚ apiclientrÚinternal.nginx_utilsrÚ xray.smart_advice_plugin_helpersrÚ!xray.internal.clwpos_safe_importsrÚ getLoggerr%r>rSrrrr!r rr úr°s¢ðððð € € € Ø€€€Ø € € € Ø € € € ØÐÐÐØ € € € ØÐÐÐØÐÐÐÐÐà5Ð5Ð5Ð5Ð5Ð5Ø/Ð/Ð/Ð/Ð/Ð/ð,Ø+Ð+Ð+Ð+Ð+Ð+Ð+øØð,ð,ð,à+Ð+€O€O€Oð,øøøð#Ð"Ð"Ð"Ð"Ð"Ø1Ð1Ð1Ð1Ð1Ð1Ø>Ð>Ð>Ð>Ð>Ð>ØIÐIÐIÐIÐIÐIà ˆÔ ˜=Ñ )Ô )€ð!0ÐðÐð Ðð=˜Cð=ð=ð=ð=ðpVðpVðpVðpVðpVñpVôpVðpVðpVðpVs²9¹AÁA