§ öÒj :ã óp—ddlmZddlmZddlmZddlZddlZddlZddlmZddl m Z ddl m Z m Z ddlmZmZd d lmZd d lmZd d lmZmZmZdd lmZmZd dlmZmZm Z m!Z!m"Z"m#Z#m$Z$d„Z%d„Z&d„Z'd„Z(d„Z)d„Z*d„Z+d„Z,dZ-dZ.dZ/dZ0dddddd œZ1d!d"d#d$d%d&d'd(d)d*d+d,d-œ Z2d.„Z3d/„Z4d0„Z5d1Z6d2„Z7d3„Z8d4„Z9dS)5é)Úprint_function)Údivision)Úabsolute_importN)Ú defaultdict)Ú iteritems)Úget_suEXEC_statusÚget_suPHP_status)ÚCageFsÚCageFsExceptioné)Ú ClUserSelect)ÚClSelect)Ú"interpreter_versions_short_summaryÚserver_applications_summaryÚ-server_nodejs_applications_with_shared_status)ÚOptionalÚDict)Ú!_is_acceptable_php_handler_cpanelÚ$_get_php_selector_domains_for_cpanelÚ#_get_php_selector_domains_for_pleskÚ _get_php_selector_domains_for_daÚ!_get_php_vhosts_for_current_panelÚ#get_php_selector_compatible_domainsÚ(get_all_selector_compatible_domains_flatcó —t|¦«S)zd Return list of InterpreterSummary objects :rtype: list[clselectctl.InterpreterSummary] )r©Ú interpreters úR/opt/cloudlinux/venv/lib64/python3.11/site-packages/clselect/clselectstatistics.pyÚ_iter_versionsr.s€õ .¨kÑ :Ô :Ð:ócó —t|¦«S)zd Return list of ApplicationSummary objects :rtype: list[clselectctl.ApplicationSummary] )rrs rÚiter_server_applicationsr"6s€õ ' {Ñ 3Ô 3Ð3r cóÊ—ddlm}t¦«}d„|D¦«}d„|D¦«}d„|D¦«}|t|¦«t|¦«f¬¦«}||fS)zACollect Node application and Shared Store aggregates in one scan.r)Úget_shared_node_modules_summarycó—g|]\}}|‘ŒS©r&)Ú.0Ú applicationÚ_actives rú z>get_nodejs_applications_and_shared_summary..Cs€ÐDÐDÐDÑ$8 K°�KÐDÐDÐDr có—g|] \}}|¯|‘Œ Sr&r&)r'r(Úactives rr*z>get_nodejs_applications_and_shared_summary..Ds1€ð&ð&ð&Ñ+>¨;¸Ø$ð&˜;ð&ð&ð&r có—h|] }|j’Œ Sr&)Úuser)r'r(s rú z=get_nodejs_applications_and_shared_summary..Fs€ÐLÐLÐL¨�KÔ$ÐLÐLÐLr )Ú active_counts)Úclselector.node_modules_storager$rÚlen)r$ÚrecordsÚ applicationsÚactive_applicationsÚ active_usersÚsnapshots rÚ*get_nodejs_applications_and_shared_summaryr8>s¢€àOÐOÐOÐOÐOÐOå;Ñ=Ô=€GØDÐD¸GÐDÑDÔD€Lð&ð&À'ð&ñ&ô&ÐàLÐLÐ8KÐLÑLÔL€LØ.Ð.ݘ<Ñ(Ô(­#Ð.AÑ*BÔ*BÐCðEñEôE€Hà ˜Ð !Ð!r có@—t|¦«}|� d„|D¦«SdS)NcóD—i|]}|j|j|j|jdœ“ŒS))Ú full_versionÚenabledÚ installed)ÚversionÚ version_fullr<r=)r'Úits rú z+get_versions_statistics..PsE€ð ð ð ð ð ŒJØ "¤Øœ:Øœ\ððð ð ð r )r)rÚinterpreters_versionss rÚget_versions_statisticsrCLsA€å*¨;Ñ7Ô7ÐØÐ(ð ð ð .ð  ñ ô ð ð)Ð(r có„—t¦«}| ¦«sdS | ¦«n#t$rYdSwxYwt t ¦«t ¦«f¦«sdSt¦«}|€dSt¦«}tt¦«}tt¦«}t|¦«D]n\}}|  |¦«sŒ|  |d¬¦«d}|| |¦«|| |¦«Œo||dœS)z+Get users and domains that use php selectorNF)Úshow_native_versionr)Údomains_by_php_versionÚusers_by_php_version)r Úis_cagefs_presentÚ _load_infor Úanyrr rr rÚsetrÚget_user_statusÚ get_versionÚupdateÚadd)ÚcagefsÚ php_vhostsÚphprFrGr.Ú user_domainsr>s rÚget_php_selector_usagerTYsb€å ‰XŒX€FØ × #Ò #Ñ %Ô %ð؈tðØ×ÒÑÔÐÐøÝ ððð؈tˆtðøøøõ Õ!Ñ#Ô#Õ%5Ñ%7Ô%7Ð8Ñ 9Ô 9ð؈tõ3Ñ4Ô4€JØÐ؈tå ‰.Œ.€CÝ(­Ñ-Ô-ÐÝ&¥sÑ+Ô+ÐÝ'¨ Ñ3Ô3ð0ð0шˆlØ×%Ò% dÑ+Ô+ð Ø à—/’/ $¸E�/ÑBÔBÀ1ÔEˆØ˜wÔ'×.Ò.¨|Ñ<Ô<Ð<ؘWÔ%×)Ò)¨$Ñ/Ô/Ð/Ð/ð#9Ø 4ð ð ðs¦;» A ÁA cób—t¦«}| d¬¦«}|€|S|dS)z7 Safely get native version, or None if not set F)ÚverboseNr)Ú ClSelectPhpÚget_native_version)rRÚvs rÚget_native_version_saferZs6€õ ‰-Œ-€CØ ×Ò uÐÑ-Ô-€AØ€yØˆØ ˆQŒ4€Kr cóJ—t¦« ¦«rdndS)z= Get state of PHP selector: without CageFS or normal Úwithout_cagefsÚnormal)rWÚwork_without_cagefsr&r rÚget_mode_of_php_selectorr_Šs%€õ +™}œ}×@Ò@ÑBÔBÐ PÐ Ð ÈÐPr cóN—t¦« ¦«dS)z- Get default version of PHP selector r)rWrMr&r rÚget_default_php_versionra“s€õ ‰=Œ=× $Ò $Ñ &Ô & qÔ )Ð)r z./var/cloudlinux/multiphp-sync/_last-check.jsonz'/var/cloudlinux/multiphp-sync/sync.confz-/var/cloudlinux/multiphp-sync/_telemetry.jsonz2/opt/cloudlinux/flags/opt-out.d/multiphp-sync.flag)Ú crash_engineÚ crash_hookÚ crash_doorÚ crash_reportÚ write_failedÚwrite_rejectedÚhandback_failedÚ slow_hookÚ pass_abortedÚselector_unreadableÚlisting_unreadableÚdefault_unreadableÚweb_server_unreadableÚrecord_unusableÚreports_cappedÚother)Ú modifyingÚ restoringrormÚ no_listingÚpin_kept_cascadeÚpin_kept_docrootÚpin_kept_unknownÚpin_kept_otherrhÚ change_capÚchange_unrecordedÚchange_in_flightÚ pass_heldrnrq)ÚfpmÚhandlerÚcascadeÚ arrival_movedÚ unroutableÚ unknown_aboveÚstalerq) rsrrÚchangeÚ new_domainÚ pass_requestÚwithdraw_pendingÚflag_withdraw_pendingÚstanding_while_offÚcheck_not_runningrq) Úno_eventÚ listener_offÚrestoreÚrenameÚdefault_changeÚhandler_changeÚown_write_failedÚunknownrq)ÚfailuresÚrefusalsÚ deviationsÚstuckÚunexplained_causesÚ mirrored_okÚmirrored_unrecordedÚ stale_mirrorÚselector_unmirroredÚowned_okÚ owned_driftÚowned_unrecordedÚout_of_coverageÚnot_in_userdataÚ unexplainedÚreleasedr�) z mirrored-okzmirrored-unrecordedz stale-mirrorzselector (unmirrored)zowned-okz DRIFT(owned)zowned-unrecordedzout-of-coverageznot-in-userdataÚ UNEXPLAINEDr¢r�cóL—i} tt¦«5}|D]X}| ¦« d¦«\}}}|r)| ¦«|| ¦«<ŒY ddd¦«n #1swxYwYn#tt f$rYnwxYw|S)z€{switch: value} from the sync's switches file; {} without one, which reads as both directions off, as it does to the engine.ú=N)ÚopenÚMULTIPHP_SYNC_CONFÚstripÚ partitionÚOSErrorÚ ValueError)ÚswitchesÚfÚlineÚkeyÚsepÚvalues rÚ_sync_switchesr²äsô€ð€Hð Ý Õ$Ñ %Ô %ð :¨Øð :ð :�Ø"&§*¢*¡,¤,×"8Ò"8¸Ñ"=Ô"=‘��S˜%Øð:Ø,1¯KªK©M¬M�H˜SŸYšY™[œ[Ñ)øð :ð :ð :ð :ñ :ô :ð :ð :ð :ð :ð :ð :øøøð :ð :ð :ð :øøõ •ZÐ ð ð ð Ø ˆð øøøà €Os5„B ˜ABÁ5 B ÂBÂB ÂB B  B! B!cój—t|t¦«rt|t¦«s|dkr|ndS)Nr)Ú isinstanceÚintÚbool©r±s rÚ _sync_countr¸ós=€Ý˜u¥cÑ*Ô*ð µ:¸eÅTÑ3JÔ3Jð Ø �QŠJˆJð ˆ5Øðr c ó´— tt¦«5}tj|¦«}ddd¦«n #1swxYwYt |t ¦«r| d¦«dkriStjtj t| d¦«¦«d¦«¦«}n#tttf$ricYSwxYwtdttj¦«|z dz¦«¦«t!| d¦«¦«d œ}t" ¦«D]Ž\}}t  |d¦«}| |¦«}t |t ¦«r| ¦«nd D](\}} |||vr|nd xxt!| ¦«z cc<Œ)|||<Œ�|S) zÊThe daily report's counters (MULTIPHP_SYNC_TELEMETRY), every key of each set, and their age; {} before the first report, and for a file of another schema or shape, whose counts would be guesses.NÚschemar Ú generatedú%Y-%m-%d %H:%M:%SréÚapache_restarts)Útelemetry_age_hoursr¾r&rq)r¦ÚMULTIPHP_SYNC_TELEMETRYÚjsonÚloadr´ÚdictÚgetÚtimeÚmktimeÚstrptimeÚstrrªr«Ú OverflowErrorÚmaxrµr¸Ú_SYNC_TELEMETRY_KEYSÚitemsÚfromkeys) r­Údatar»ÚresultÚnameÚkeysÚcountsÚfoundr¯r±s rÚ_sync_telemetryrÔøs€ðÝ Õ)Ñ *Ô *ð ¨aÝ”9˜Q‘<”<ˆDð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð å˜$¥Ñ%Ô%𠨯ª°(Ñ);Ô);¸qÒ)@Ð)@؈IÝ”K¥¤ ­c°$·(²(¸;Ñ2GÔ2GÑ.HÔ.HØ.Añ!Cô!CñDôDˆ ˆ øå •Z¥Ð /ðððØˆ ˆ ˆ ðøøøå%(¨­Cµ´±´¸yÑ1HØ37ñ18ñ-9ô-9ñ&:ô&:å!,¨T¯XªXÐ6GÑ-HÔ-HÑ!IÔ!IðKðK€Fõ+×0Ò0Ñ2Ô2ðð‰ ˆˆdÝ—’˜t QÑ'Ô'ˆØ—’˜‘”ˆÝ,6°u½dÑ,CÔ,CÐK˜5Ÿ;š;™=œ=˜=Èð Lð L‰JˆC�Ø ˜# ˜-˜-�3�3¨WÐ 5Ð 5Ô 5½ÀUÑ9KÔ9KÑ KÐ 5Ð 5Ñ 5Ð 5؈ˆt‰ ˆ Ø €Ms3‚B:–7« B:·;»B:¾;¿2B:Á2AB:Â:CÃC)ÚinheritÚ ea_defaultÚ ea_foreignÚalt_phpr}Úunreadcó°—| d¦«rdS| d¦«sdS| d¦«}|dkrdS||kr,t|t¦«r| d¦«rdSt|t¦«r| d¦«rdSt|t¦«r| d ¦«rd Sd S) zˆThe pin-class counter one snapshot row belongs to, or None for a spelling the classes do not cover (counted nowhere, never guessed).r}Úpin_readrÙÚpinrÕzea-phprÖr×zalt-phprØN)rÄr´rÈÚ startswith)ÚrowÚ default_phprÜs rÚ_sync_pin_classràsá€ð ‡w‚wˆu�~„~ð؈uØ �7Š7�:Ñ Ô ð؈xØ �'Š'�%‰.Œ.€CØ ˆiÒÐØˆyð ˆkÒÐ�j¨­cÑ2Ô2ÐØ—’˜xÑ(Ô(ðàˆ|Ý�#•sÑÔð §¢¨xÑ 8Ô 8ð؈|Ý�#•sÑÔð §¢¨yÑ 9Ô 9ð؈yØ ˆ4r cóž— tt¦«5}tj|¦«}ddd¦«n #1swxYwYn#tt f$rYdSwxYwt |t¦«r| d¦«dkrdS tj tj t| d¦«¦«d¦«¦«}n#t tf$rYdSwxYwtdttj ¦«|z dz¦«¦«}| dg¦«}| d i¦«}t |t ¦«r.t |t¦«rt#d „|D¦«¦«sdS| d ¦«}t t&d¦«}|D]=}| d g¦«D]$} t)| |¦«} | r|| xxdz cc<Œ%Œ>t t* ¦«d¦«} | ¦«D];\} } t* | ¦«}|rt | t¦«r| | |<Œ Selector agreement counters, from the drift checker's last snapshot: per-domain pin classes and drift verdicts, plus account coverage, and the switches as they are now. None when there is no usable snapshot (the checker never ran — it runs only while the sync is on — or one of an unknown schema or shape): the summary then carries no sync fields at all, which is distinguishable from a fleet with zero domains. A snapshot that has aged is still reported, with its age in snapshot_age_hours.Nrºr r»r¼rr½ÚusersÚverdictsc3óìK—|]o}t|t¦«oUt| dg¦«t¦«o,t d„| dg¦«D¦«¦«V—ŒpdS)Údomainsc3ó@K—|]}t|t¦«V—ŒdS)N)r´rÃ)r'rÞs rú z4get_multiphp_sync_stats...PsHèè€ðCðCØ#&õ *¨#­tÑ4Ô4ðCðCðCðCðCðCr N)r´rÃrÄÚlistÚall)r'r.s rrçz*get_multiphp_sync_stats..Ns§èè€ð*ð*ð õ " $­Ñ-Ô-ðCÝ% d§h¢h¨y¸"Ñ&=Ô&=½tÑDÔDðCåðCðCØ*.¯(ª(°9¸bÑ*AÔ*AðCñCôCñCôCð*ð*ð*ð*ð*ð*r rßråÚ suspendedÚselector_to_multiphpÚonÚmultiphp_to_selectorc3óDK—|]}| d¦«°dV—ŒdS)Úansweredr N)rÄ)r'Úus rrçz*get_multiphp_sync_stats..gs3èè€ÐJÐJ a¸¿º¸jÑ8IÔ8IÐJ ÐJÐJÐJÐJÐJÐJr Ú enabled_byÚ disabled_by) rêÚmirror_enabledÚlistener_enabledÚsnapshot_age_hoursrâÚusers_unansweredÚpinsrãrñròÚflag_opted_out)#r¦ÚMULTIPHP_SYNC_LAST_CHECKrÁrÂrªr«r´rÃrÄrÅrÆrÇrÈrÉrÊrµrèrérÍÚ_SYNC_PIN_CLASSESràÚ_SYNC_VERDICT_KEYSÚvaluesrÌr²r¶r2ÚsumÚ _sync_actorÚosÚpathÚexistsÚMULTIPHP_SYNC_FLAG_OPT_OUTrNrÔ)r­Úreportr»Ú age_hoursrâÚtotalsrßr÷r.rÞÚ pin_classrãÚverdictÚcountr¯r¬rÏs rÚget_multiphp_sync_statsr ,sÝ€ðÝ Õ*Ñ +Ô +ð "¨qÝ”Y˜q‘\”\ˆFð "ð "ð "ñ "ô "ð "ð "ð "ð "ð "ð "øøøð "ð "ð "ð "øøå •ZÐ ððð؈tˆtðøøøå �f�dÑ #Ô #ð v§z¢z°(Ñ';Ô';¸qÒ'@Ð'@؈tðÝ”K¥¤ ­c°&·*²*¸[Ñ2IÔ2IÑ.JÔ.JØ.Añ!Cô!CñDôDˆ ˆ øå � Ð &ððððˆtˆtðøøøõ�A•s�DœI™KœK¨)Ñ3¸Ñ<Ñ=Ô=Ñ>Ô>€IØ �JŠJ�w Ñ #Ô #€EØ �ZŠZ˜  BÑ 'Ô '€Fõ �e�TÑ "Ô "ð­*°V½TÑ*BÔ*BðÝð*ð*ð$)ð *ñ*ô*ñ*ô*ðð ˆtØ—*’*˜]Ñ+Ô+€KÝ �=Š=Õ*¨AÑ .Ô .€DØð%ð%ˆØ—8’8˜I rÑ*Ô*ð %ð %ˆCÝ'¨¨[Ñ9Ô9ˆIØð %Ø�Y��” 1Ñ$��‘øð %õ�}Š}Õ/×6Ò6Ñ8Ô8¸!Ñ<Ô<€HØ Ÿ,š,™.œ.ð"ð"‰ˆ�Ý ×$Ò$ WÑ-Ô-ˆØ ð "•:˜e¥SÑ)Ô)ð "Ø!ˆH�S‰MøÝÑÔ€Hå�˜fŸjšj¨Ñ5Ô5Ñ6Ô6Ñ7Ô7ݘhŸlšlÐ+AÑBÔBÀdÒJÑKÔKÝ § ¢ Ð-CÑ DÔ DÈÒ LÑMÔMØ'Ý�U‘”ÝÐJÐJ¨5ÐJÑJÔJÑJÔJØØõ" (§,¢,¨|Ñ"<Ô"<Ñ=Ô=Ý" 8§<¢<° Ñ#>Ô#>Ñ?Ô?Ý�bœgŸnšnÕ-GÑHÔHÑIÔIðð€Fð ‡M‚M•/Ñ#Ô#Ñ$Ô$Ð$Ø €Ms?‚A–7« A·;»A¾;¿AÁAÁA ACÃC)Ã(C)có—|dvr|ndS)z2`admin`, `remote`, or empty: nothing else is sent.)ÚadminÚremoteÚr&r·s rrþrþts€àÐ0Ð0Ð0ˆ5ˆ5°bÐ8r ):Ú __future__rrrrÁrÿrÅÚ collectionsrÚ future.utilsrÚ cldetectlibrr Úcllimitsr r Ú cluserselectr ÚclselectrrWÚ clselectctlrrrÚtypingrrÚclselectdomainsrrrrrrrrr"r8rCrTrZr_rarùr§rÀrrËrûr²r¸rÔrúràr rþr&r rúrsäðð&Ð%Ð%Ð%Ð%Ð%ØÐÐÐÐÐØ&Ð&Ð&Ð&Ð&Ð&Ø € € € Ø € € € Ø € € € Ø#Ð#Ð#Ð#Ð#Ð#Ø"Ð"Ð"Ð"Ð"Ð"à;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ø,Ð,Ð,Ð,Ð,Ð,Ð,Ð,à&Ð&Ð&Ð&Ð&Ð&Ø-Ð-Ð-Ð-Ð-Ð-ððððððððððð "Ð!Ð!Ð!Ð!Ð!Ð!Ð!ð ðððððððððððððððððð;ð;ð;ð4ð4ð4ð "ð "ð "ð  ð  ð  ð#ð#ð#ðLðððQðQðQð*ð*ð*ð LÐð ?ÐðJÐð9ðð,ð ð DðBðCð%ðÐð8!Ø0Ø"Ø2ØØ!Ø*Ø(Ø(Ø ð Øð!ðÐð( ð ð ðððð ððð2&Ððððð.EðEðEðP9ð9ð9ð9ð9r