9Mj1dZddlZddlZddlZddlZddlZddlZddlZddlm Z ddl m Z ddl m Z  ddlmZn#e$rdZYnwxYwdd lmZdd lmZdd lmZdd lmZejd ZdZdZdZdefdZGddZ dS)zG This module contains a wrapper around `clwpos-user get` local utility N)Optionalbuild_clwpos_user_cmd)CloudlinuxSummary)is_wpos_visiblecdS)Nusernames N/opt/cloudlinux/venv/lib64/python3.11/site-packages/xray/adviser/clwpos_get.pyr st) get_client)NginxUserCache)get_plugin_status)any_suite_allowed_on_server clwpos_utilixreturnc|dnt|}t|tkr|S|dtdzS)zLReturn a bounded, redaction-marked snippet of subprocess output for logging.Nz...[truncated])strlen_CLWPOS_LOG_SNIPPET_MAX)outputtexts r _log_snippetr4sD22S[[D 4yy+++ ((( ),< < > >44444    LLW$A C C C4 ?? LLXJ V0D0D F F F4 :fllnn-- -#    LLSL$8$8 : : :44 sAA A<"A77A<BC"6!CC"%E--=F.-F.cmdctjtz}tj|tjtjd}t}d} |j}|J |tjz }|dkrtj |ttj |ggg|\}}}|stj |ttj | d} | snAt|t| ztkrd}n|| |rd|jdf|| |d n#tj $rYnwxYw|j|jSS|t-d |tjz  } || |d n#tj $rYnwxYw|j|jn{#|| |d n#tj $rYnwxYw|j|jwwxYw|d d | dfS)uRun ``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)rEstderrbufsizeFNTir)timeoutgzutf-8replace)errors)time monotonic_CLWPOS_SCAN_TIMEOUTr<PopenPIPEDEVNULL bytearrayrETimeoutExpiredselectr5readfilenorr>extendrFpollkillwaitclosemaxdecode) rIdeadlineprocbufrGrE remainingreadable_chunkrFs r r:zClWposGetter._run_scan_boundeds$>##&::JO(2(:AGGGkk& $[F%%% "$t~'7'77 >>$3C9MNNN"(xR!K!K!QO$3C9MNNN 77s88c%jj(+HHH#H 5!!!# "$ 14?D0yy{{"   ! $$$$,    {& !!####'3sHt~?O?O4O+P+PQQJyy{{"   ! $$$$,    {& !!###yy{{"   ! $$$$,    {& !!####'zz')z44j%GGs[C0I.2F  FF8I.!H88I  I .)K&J/.K&/K>K&K%K&c(fd|DS)zp Iterate through advices and return only those which relate to current user-domain-site cg|]:}|ddkr&|ddkr|ddk8|;S)metadatar r"websiter ).0advicer"userrms r z8ClWposGetter.get_advices_for_website..sd   j!*-55j!(+v55j!),77 877rr )advicesrpr"rms ```r get_advices_for_websitez$ClWposGetter.get_advices_for_websites:       !    rc6i}|||}|s|Sg}|dD]\}}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/)r6ruwp_plugin_statusz)Getting Smart Advice plugin status failedr6rur r"websitesserver_load_rate) rHitemsgetrsrappenddict Exceptionr% exceptionr{) r+r r"current_advicesfinal_metadatawebsites_metadatarzsiterur6website_issuesadvice_for_websitesmart_advice_plugin_statuss r get_updated_extended_metadataz*ClWposGetter.get_updated_extended_metadatas LL6::  "! !-h7==??  LD&t::D.x8<xHNHLHVHZ .\.\*$,:6P!R!R!RSSSS  = = =  !LMMM$,:!<!<!<===== =% $$($9$9$;$; NN s8B11AC<;C<cd}|||=||fddD|d}|S)zX Ensure format accepted by Smart Advice POST requests/metadata endpoint Nc rg|]3\}}td|d|g4S)rvrurx)rr})rnrrudatas r rqz3ClWposGetter.construct_metadata..s^!#!#!#%1T6"&:t::-1(^-?-?b-I-I"K"K"K!#!#!#rrury)rHr|r{)r+r r0 dummy_resultrs @r r'zClWposGetter.construct_metadatas ||Hj11  (0&0!#!#!#!#59(^5I5I5K5K!#!#!#150E0E0G0GIILrc tj}n@#t$r3}tdt |Yd}~dSd}~wwxYwt jpd}||z S)rz%Unable to get domains_total stats: %sNgg?)r_get_total_domains_amountrr%r*rmultiprocessing cpu_count) domains_totalrDrs r r{zClWposGetter.server_load_rate s~ -GIIMM    LL@#a&& I I I44444  $-//63 y((s A(AAstatct|dr/td}||dSdS)zo Send gathered metadata to adviser miscroservice. Ignore sending if websites are empty rzadviser)rN)r send_stat)rclients r r)zClWposGetter.sendsK   * **F FHH  D  ) ) ) ) ) * *rc`tstj|jdgddSdS)z Needed to save PHP info to work without clwpos_monitoring demon when AccelerateWP is turned off completely z--forceT)capture_outputN)rr<runawp_info_collector)r+s r save_clwpos_infozClWposGetter.save_clwpos_info&sC +,, V ND3Y?PT U U U U U U V Vr)__name__ __module__ __qualname__r8rrr- staticmethodboolr$listr3rrrHr:rsrr'floatr{r)rr rr r!r!<s !DB cc c3 c4 c c c c3s3t333\3 R3RCRDRRRR,,,$,,,,\=Ht=H=H=H\=H~   \  %%%N3CD& )e ) ) )\ )*4*D***\*VVVVVrr!)!__doc__r?loggingr5rYr<rQrtypingrxray.internal.utilsrclsummary.summaryr clwpos.papir ImportError apiclientrinternal.nginx_utilsr xray.smart_advice_plugin_helpersr!xray.internal.clwpos_safe_importsr getLoggerr%r>rSrrrr!r rr rs   555555//////,+++++++,,,++OOO,#"""""111111>>>>>>IIIIII  = ) )!0 =C====pVpVpVpVpVpVpVpVpVpVs9AA