§ Å«jp`ãóÔ—dZdZddlZddlZddlZddlZddlmZddlm Z m Z m Z ddl m Z m Z ddlmZddlmZmZmZmZmZmZdd lmZddlZdd lmZdd lmZdd lm Z dd l!m"Z"m#Z#ddl$m%Z%m&Z&m'Z'ddl(m)Z)ddl*m+Z+ddl,m-Z-m.Z.ddl/m0Z0dZ1 ddl2m3Z4n#e5$rZ6e6Z1dZ4YdZ6[6ndZ6[6wwxYwe Gd„d¦«¦«Z7e Gd„d¦«¦«Z8e Gd„d¦«¦«Z9Gd„de¦«Z:de;de:fd„Z<Gd„de ¦«Z=de;fd „Z>d!e;fd"„Z?e@d#krHe0¦«ejAe?e>¦«¦«ejB¬$¦«e=¦«ZCeC¦«dSdS)%z' This module contains Autotracer class z ssa.moduleséN)Ú defaultdict)Ú dataclassÚfieldÚasdict)ÚdatetimeÚ timedelta)Ú fnmatchcase)ÚDictÚIteratorÚOptionalÚ NamedTupleÚListÚIterable)Úurlparse)Úsetup_database)ÚSSAError)ÚCommon)Úiter_domains_dataÚiter_domain_url_data)ÚstatusÚdisabled_usersÚmisconfiguration_checks)Ú load_tunables)Úautotracing_tunables_schema)Úautotracing_logÚautotracing_stats_file)Ú sentry_initcóZ—eZdZUdZeed<eed<eed<eed<eed<eed<eed<d S) ÚURLzURL data containerÚuriÚ avg_durationÚ max_durationÚtotal_slow_reqsÚ total_reqsÚ belongs_toÚbelongs_to_userN)Ú__name__Ú __module__Ú __qualname__Ú__doc__ÚstrÚ__annotations__Úint©óúM/opt/cloudlinux/venv/lib64/python3.11/site-packages/ssa/modules/autotracer.pyrr-sc€€€€€€àÐà €H€H�HØÐÐÑØÐÐÑØÐÐÑØ€O€O�OØ€O€O�OØÐÐÑÐÐr/rcó®—eZdZUdZdZeed<dZeed<dZeed<dZ eed<dZ eed<dZ eed<dZ eed <dZ eed <dZeed <dZeed <dZeed <dS)Ú RulesRejectszRejects counters containerrÚnon_wpÚ throttledÚdensityÚslownessÚ max_slownessÚdisabledÚnginxÚ frequencyÚ server_limitÚ domain_limitÚ no_domainN)r'r(r)r*r3r-r,r4r5r6r7r8r9r:r;r<r=r.r/r0r2r2:s€€€€€€à$Ð$à€FˆC€O€O�OØ€IˆsÐÐÑØ€GˆSÐÐÑØ€HˆcÐÐÑØ€L�#ÐÐÑØ€HˆcÐÐÑØ€Eˆ3€N€N�NØ€IˆsÐÐÑØ€L�#ÐÐÑØ€L�#ÐÐÑØ€IˆsÐÐÑÐÐr/r2có\—eZdZUdZeed<dZeed<dZeed<e e ¬¦«Z e ed<dS) ÚStatszAutoTracer statistics containerÚ rules_versionrÚurls_processedÚ urls_selected)Údefault_factoryÚrejectsN) r'r(r)r*r+r,rAr-rBrr2rDr.r/r0r?r?Ksa€€€€€€à)Ð)àÐÐÑØ€N�CÐÐÑØ€M�3ÐÐÑØ!˜E°,Ð?Ñ?Ô?€Gˆ\Ð?Ð?Ñ?Ð?Ð?r/r?có(—eZdZUdZeed<eed<dS)ÚURLSz" Representation of an URL Ú domain_nameÚuri_pathN)r'r(r)r*r+r,r.r/r0rFrFUs1€€€€€€ðððÐÐÑØ€M€M�M€M€Mr/rFÚurlÚreturncóú—t|¦«}|jr d|j›�nd}|jr |j›|›�nd}|j dd¦«}| d¦«d}t ||¦«S)zÈ Split URL into domain_name and uripath including query string :param url: URL of format protocol://domain/path;parameters?query#fragment :return: namedtuple URL(domain_name, uripath) ú?Úú/zwww.ú:r)rÚqueryÚpathÚnetlocÚreplaceÚsplitrF)rIÚ fragmentsÚqsr Ú_no_www_netlocÚ_no_port_netlocs r0Ú url_splitrY^s‰€õ ˜‘ ” €IØ"+¤/Ð 9Ð ˆYŒ_Ð Ð Ð °r€BØ%.¤^Ð <ˆYŒ^Ð !˜RÐ !Ð !Ð !¸€CØÔ%×-Ò-¨f°bÑ9Ô9€NØ$×*Ò*¨3Ñ/Ô/°Ô2€OÝ � Ñ %Ô %Ð%r/có⇗eZdZdZd#ˆfd„ Zˆfd„Zedefd„¦«Zede de e fd„¦«Z d e de fd „Zdefd „Zd#d e edefd „Zde de fd„Zdedede fd„Zdeede fd„Zdeede fd„Zde edede fd„Zde e de fd„Zdeefd„Zd#de edeefd„Zdeefd„Zdeefd„Z d$d„Z!d$d „Z"defd!„Z#defd"„Z$ˆxZ%S)%Ú AutoTracerz0 SSA autotracing module implementation. NcóB•—t¦« ¦«tjd¦«|_|j dt ¦«t¦«|_t¦«|_ d|_ |r|n t¦«|_ dS)NÚ auto_tracerzAutoTracer enabled: %s) ÚsuperÚ__init__ÚloggingÚ getLoggerÚloggerÚinfoÚ __package__ÚlistrÚ tasks_listÚstatsrÚengine)ÚselfrhÚ __class__s €r0r_zAutoTracer.__init__qs|ø€Ý ‰Œ×ÒÑÔÐÝÔ'¨ Ñ6Ô6ˆŒ Ø Œ ×ÒÐ1µ;Ñ?Ô?Ð?Ý"™fœfˆÔÝ™&œ&ˆŒØˆŒ à &Ð<�f�f­NÑ,<Ô,<ˆŒ ˆ ˆ r/cóê•— t¦«n8#t$r+}|j d|j¦«Yd}~dSd}~wwxYwt €it j d¦«r.|j  dtt¦«¦«n|j d¦«dSt j }|��|j d¦«t¦« ¦«|j d|j¦«t#|j¦«|_| ¦«D]Ž}|j d|j¦«|jxjdz c_ ||j|j¬ ¦«ŒP#t0$r2}|j  d t|¦«¦«Yd}~Œ‡d}~wwxYw| ¦«dS) NzAutoTracer skipped: %sz/usr/sbin/cloudlinux-xray-agentz1AutoTracer skipped: X-ray module import error: %sz'AutoTracer skipped: X-Ray not installedzAutoTracer startedzAutoTracer loaded config: %szStarting auto task for %sé)rIÚ tracing_countzFailed to start task: %s)rrrbrcÚreasonÚxray_libÚosrQÚexistsÚerrorr+Úxray_import_errorÚstart_autotracingr^r_ÚdebugÚconfigr?r@rgÚurls_scheduledr rBÚrequest_numberÚ ExceptionÚsave_iteration_stats)riÚexcÚ start_toolrIÚerjs €r0Ú__call__zAutoTracer.__call__{sø€ð Ý #Ñ %Ô %Ð %Ð %øÝð ð ð Ø ŒK× Ò Ð5°s´zÑ BÔ BÐ BØ ˆFˆFˆFˆFˆFøøøøð øøøõ Ð åŒw�~Š~Ð?Ñ@Ô@ð LØ” ×!Ò!ØGÝÕ)Ñ*Ô*ñôððð ” × Ò Ð!JÑKÔKÐKØ ˆFåÔ/ˆ à Ñ !Ø ŒK× Ò Ð1Ñ 2Ô 2Ð 2å ‰GŒG× Ò Ñ Ô Ð Ø ŒK× Ò Ð<¸d¼kÑ JÔ JÐ Jå˜tÔ1Ñ2Ô2ˆDŒJØ×*Ò*Ñ,Ô,ð Jð J�Ø” × Ò Ð!<¸c¼gÑFÔFÐFØ” Ð(Ô(¨AÑ-Ð(Ô(ðJØ�J 3¤7¸$Ô:MÐNÑNÔNÐNÐNøÝ ðJðJðJà”K×%Ò%Ð&@Å#ÀaÁ&Ä&ÑIÔIÐIÐIÐIÐIÐIÐIøøøøðJøøøð ×!Ò!Ñ#Ô#Ð#Ð#Ð#s,ƒ’ Aœ AÁAÆF Æ GÆ*(GÇGrJcó,—tdt¦«S)z$ Load configuration zautotracing.json)rrr.r/r0Ú load_confzAutoTracer.load_conf s€õ Ð/Õ1LÑMÔMÐMr/rGcó<—t€dStj|¦«S)z; Gets domain info for the specified domain N)roÚ domain_info)rGs r0Úgets_domaininfozAutoTracer.gets_domaininfo§s €õ Ð Ø�4ÝÔ# KÑ0Ô0Ð0r/Ú user_namecóX—|jr"t€dStj|¦«jSdS)z> Says if nginx is enabled for a specific user NF)Ú skip_nginxroÚNginxUserCacheÚ is_enabled)rir„s r0Únginx_is_enabledzAutoTracer.nginx_is_enabled°s3€ð Œ?ð AÝÐØ�uÝÔ*¨9Ñ5Ô5Ô@Ð @؈ur/cóˆ—td„|jD¦«¦«}|j d|¦«|j|z S)z>Recalculate limit per server taking into account running taskscóB—g|]}|ddk¯|ddk¯|‘ŒS)rÚrunningÚuserz *autotracing*r.)Ú.0Útasks r0ú z.½s8€Ð qÐ qÐ q�d°°h´À9Ò1LÐ1LÐQUÐV\ÔQ]ÐapÒQpÐQpˆTÐQpÐQpÐQpr/z&Number of running autotracing tasks %s)ÚlenrfrbruÚper_server_limit)riÚ running_counts r0Úper_server_limit_recalculatedz(AutoTracer.per_server_limit_recalculatedºsM€åØ qÐ q˜dœoÐ qÑ qÔ qñ ô ˆ ð Œ ×ÒÐBÀMÑRÔRÐRØÔ$ }Ñ4Ð4r/Ú full_listcóÒ‡—|€.tj¦«}|j d|¦«t j¦«t |j¬¦«z Šˆfd„|D¦«S)zQ Excludes tasks older than N days from the general list of tasks NzTask list loaded %s)Údaysc󲕗g|]S}| d¦«�| d¦«ndt‰ ¦«¦«k¯Q|‘ŒTS)Ú createtimeNr)Úgetr-Ú timestamp)rŽr�Ú n_days_agos €r0r�z1AutoTracer.excludes_old_tasks..Ësgø€ð ð ð àØ*.¯(ª(°<Ñ*@Ô*@Ð*L�—’˜Ñ&Ô&Ð&ÐRSÕWZÐ[e×[oÒ[oÑ[qÔ[qÑWrÔWrÒrÐrð àrÐrÐrr/)rorfrbrurÚnowrÚmin_retracing_interval)rir•rœs @r0Úexcludes_old_taskszAutoTracer.excludes_old_tasksÂs{ø€ð Ð Ý Ô+Ñ-Ô-ˆIØ ŒK× Ò Ð3°YÑ ?Ô ?Ð ?å”\‘^”^¥i°TÔ5PÐ&QÑ&QÔ&QÑQˆ ð ð ð ð à!ð ñ ô ð r/Ú current_urlcó\—t|¦«}|jD]”}t|d¦«}|j|jko|j|jk}t |j|j¦«ot |j|j¦«}|s|r%|j d||d¦«dSŒ•dS)z¢ Excludes url from the list if it completely matches the current url or if domain names match and "*" follows the domain name in the list rIz2Skipped: URL %s was traced recently. Matched by %sTF)rYrfrGrHr rbru)rir ÚcÚ task_dataÚtÚ direct_matchÚwildcard_matchs r0Úexclude_thesame_urlszAutoTracer.exclude_thesame_urlsÑsÆ€õ �kÑ "Ô "ˆØœð ð ˆIå˜) EÔ*Ñ+Ô+ˆAØœ=¨A¬MÒ9ÐV¸a¼jÈAÌJÒ>VˆLÝ(¨¬¸¼ ÑFÔFÐnÍ;ÐWXÔWaÐcdÔcmÑKnÔKnˆNØð ˜~ð Ø” ×!Ò!ØHØØ˜eÔ$ñôðð �t�tð  ðˆur/Úurl_total_reqsÚdomain_total_reqscó®—|jrMtjtj||¦«¦«}|j d|¦«||jkSdS)z-Check that URL density passes given thresholdzCalculated density %sT)r5ÚnpÚaminÚcorrcoefrbruÚdensity_threshold)rir¨r©Ú url_densitys r0Úpass_by_densityzAutoTracer.pass_by_densityæsT€à Œ<ð 8Ýœ'¥"¤+¨nÐ>OÑ"PÔ"PÑQÔQˆKØ ŒK× Ò Ð5°{Ñ CÔ CÐ CØ Ô!7Ò7Ð 7؈tr/Ú url_durationscóŽ—d|jz }tj||¦«}|j d||¦«||jkS)zË The measure of "slowness" for URL is: at least N% of its requests take more than X seconds. N% -- self.slow_duration_percentage X -- self.slow_duration_threshold édz.Calculated %sth percentile %s for min duration)Úslow_duration_percentager«Ú percentilerbruÚslow_duration_threshold)rir±Úreversed_percentileÚreversed_percentile_values r0Úpass_by_slowness_percentilez&AutoTracer.pass_by_slowness_percentileîsX€ð" DÔ$AÑAÐÝ$&¤M°-ÐATÑ$UÔ$UÐ!Ø Œ ×ÒØ <Ø Ø %ñ ô ð ð )¨DÔ,HÒHÐHr/cóŽ—tj||j¦«}|j d|j|¦«||jkS)a The opposite to pass_by_slowness_percentile method. The measure of "much slowness" for URL is: at least N% of its requests must take less than X seconds. N% -- self.max_slow_duration_percentage X -- self.max_slow_duration_threshold z.Calculated %sth percentile %s for max duration)r«rµÚmax_slow_duration_percentagerbruÚmax_slow_duration_threshold)rir±Úpercentile_values r0Úpass_by_max_slowness_percentilez*AutoTracer.pass_by_max_slowness_percentileþsO€õœ=¨¸Ô8YÑZÔZÐØ Œ ×ÒØ <Ø Ô -Ø ñ ô ð ð   4Ô#CÒCÐCr/Úurl_throttled_reqscóš—|€dSt|¦«t|¦«z dz}|j d|¦«||jkS)zY Check that percent of throttled requests per URL passes given threshold NFr³zCalculated throttled percent %s)ÚsumrbruÚallowed_throttling_percentage)rir¿r¨Úthrottled_percents r0Úpass_by_allowed_throttlingz%AutoTracer.pass_by_allowed_throttlingsX€ð Ð %à�5Ý Ð!3Ñ4Ô4µs¸>Ñ7JÔ7JÑJÈcÑQÐØ Œ ×ÒÐ;Ð=NÑOÔOÐOØ  DÔ$FÒFÐFr/Ú wp_statuscó2—|jrt|¦«SdS)zx Check that URLs of a particular domain should be analyzed. For now we skip non-wordpress sites T)Úonly_wpÚbool)rirÅs r0Úpass_by_enginezAutoTracer.pass_by_engines€ð Œ<ð #å˜ ‘?”?Ð "؈tr/c #óK—t|j¦«D�]ç}d}| |j¦«sQ|j d¦«|j}|jjxj |z c_ |jxj |z c_ Œpt|j|j ¦«D�][\}}}||j vrŒ|j d|¦«|jxj dz c_ | | d¦«|d¦«s5|j d¦«|jjxjdz c_Œ¥| |d|j¦«s5|j d¦«|jjxjdz c_Œû| |¦«s6|j d ¦«|jjxjdz c_�ŒF| |¦«s6|j d ¦«|jjxjdz c_�Œ‘|€Y| |j ¦«}|€6|j d ¦«|jjxjdz c_�Œå|j}t7|t9t;j|¦«¦«t?|d ¦«t?|d¦«tA|¦«|j |¬ ¦«V—�Œ]�ŒédS)a  Select all URLs suitable for auto tracing by very basic rules: - WP site - suitable throttling - suitable density - measure of "slow" URL ORDER OF RULES MUST NOT BE CHANGED: IT AFFECTS STATISTICS COUNTERS Nz Skipped by engine: non-wordpresszProcessing URL %srlr¿r¨zSkipped by throttled percentzSkipped by densityzSkipped by slowness percentilez"Skipped by max slowness percentilez"Skipped by unavailable domain infoÚ url_slow_reqs)r!r#r$r"r%r&)!rrhrÉÚis_a_wordpress_domainrbruÚ urls_numberrgrDr3rArrGÚnon_url_fieldsrÄršr4r°r©r5r¹r6r¾r7rƒr=r�rr-r«ÚmeanrÁÚmax)riÚ domain_dataÚ domain_ownerÚ skipped_countrIÚ durationsÚdatar‚s r0Úurls_computationally_filteredz(AutoTracer.urls_computationally_filtered#s.èè€õ-¨T¬[Ñ9Ô9ðJ ñJ ˆK؈LØ×&Ò& {Ô'HÑIÔIð ð” ×!Ò!Ð"DÑEÔEÐEð!,Ô 7� Ø” Ô"Ð)Ô)¨]Ñ:Ð)Ô)Ø” Ð)Ô)¨]Ñ:Ð)Ô)Øõ )=¸T¼[È+ÔJaÑ(bÔ(bð8 ñ8 Ñ$��Y Ø˜$Ô-Ð-Ð-àà” ×!Ò!Ð"5°sÑ;Ô;Ð;Ø” Ð)Ô)¨QÑ.Ð)Ô)Ø×6Ò6°t·x²xÐ@TÑ7UÔ7UÐW[Ð\lÔWmÑnÔnðð”K×%Ò%Ð&DÑEÔEÐEØ”JÔ&Ð0Ô0°AÑ5Ð0Ô0Øà×+Ò+¨DÐ1AÔ,BÀKÔDaÑbÔbðð”K×%Ò%Ð&:Ñ;Ô;Ð;Ø”JÔ&Ð.Ô.°!Ñ3Ð.Ô.Øà×7Ò7¸ ÑBÔBðð”K×%Ò%Ð&FÑGÔGÐGØ”JÔ&Ð/Ô/°1Ñ4Ð/Ô/Ùà×;Ò;¸IÑFÔFðð”K×%Ò%Ð&JÑKÔKÐKØ”JÔ&Ð3Ô3°qÑ8Ð3Ô3Ùð Ð'Ø"&×"6Ò"6°{Ô7NÑ"OÔ"O�KØ"Ð*ðœ ×)Ò)Ð*NÑOÔOÐOØœ Ô*Ð4Ô4¸Ñ9Ð4Ô4Ù à'2Ô'7˜ åØÝ!$¥R¤W¨YÑ%7Ô%7Ñ!8Ô!8Ý$'¨¨_Ô(=Ñ$>Ô$>Ý" 4Ð(8Ô#9Ñ:Ô:Ý!$ Y¡¤Ø*Ô6Ø$0ðñôðððñña8 ð%J ðJ r/Ústats_collectedc#ó¤K—| ¦«| ¦«D]¤}|j|jvr;|j d|j¦«|jjxjdz c_ŒK|  |j¦«r;|j d|j¦«|jjxj dz c_ Œ |V—Œ¥dS)zÕ From selected by computed thresholds URLs take those for which: - autotracing enabled - nginx disabled ORDER OF RULES MUST NOT BE CHANGED: IT AFFECTS STATISTICS COUNTERS z'Skipped: autotracing is disabled for %srlz Skipped: nginx is enabled for %sN) Úfill_in_disabled_usersrÖr&rrbrurgrDr8r‰r9)rir×rIs r0rBzAutoTracer.urls_selectedxsèèè€ð ×#Ò#Ñ%Ô%Ð%à×5Ò5Ñ7Ô7ð ð ˆCØÔ" dÔ&9Ð9Ð9ð” ×!Ò!Ð"KÈSÔM`ÑaÔaÐaØ” Ô"Ð+Ô+¨qÑ0Ð+Ô+ØØ×$Ò$ SÔ%8Ñ9Ô9ð ð” ×!Ò!Ð"DÀcÔFYÑZÔZÐZØ” Ô"Ð(Ô(¨AÑ-Ð(Ô(ØØˆIˆIˆIˆIð ð r/c#óÐK—d}tt¦«}| ¦«|_| ¦«}| ¦«}|j d|¦«|D]î}| |j ¦«r|j j xj dz c_ Œ7||krv||j |jkr|dz }||j xxdz cc<|V—Œr|j d|j |j¦«|j j xjdz c_Œ³|j d|j |¦«|j j xjdz c_ŒïdS)a§ Schedule autotracing by sorted list taking into account the limits: - no same task for 10 days - limit per server - limit per domain Rule ordering still affects statistics counters, but the counting for rules #8 (frequency) and #9 (domain_limit) now happens during candidate selection in urls_sorted() (which bounds the candidate list to the best per_domain_limit URLs per domain). Only server_limit (#10) is counted here. Keep this attribution in sync with urls_sorted() and docs/design/autotracer-and-decision-maker.md. Return resulting list of URLs scheduled for auto tracing rzSorted scheduled list %srlz#Skipped URL %s by domain limit (%s)z#Skipped URL %s by server limit (%s)N)rr-rŸrfr”Ú urls_sortedrbrur§r rgrDr:r%Úper_domain_limitr<r;)riÚgeneral_tasks_counterÚtasks_counter_per_domainÚper_server_smart_limitÚ sorted_urlsrIs r0rwzAutoTracer.urls_scheduled‘s èè€ð!"ÐÝ#.­sÑ#3Ô#3Ð ð×1Ò1Ñ3Ô3ˆŒØ!%×!CÒ!CÑ!EÔ!EÐð×&Ò&Ñ(Ô(ˆ Ø Œ ×ÒÐ4°kÑBÔBÐBØð 5ð 5ˆCØ×(Ò(¨¬Ñ1Ô1ð ð” Ô"Ð,Ô,°Ñ1Ð,Ô,ØØ$Ð'=Ò=Ð=Ø+¨C¬NÔ;¸dÔ>SÒSÐSØ)¨QÑ.Ð)Ø,¨S¬^Ð<Ð<Ô<ÀÑAÐ<Ð<Ñ<Ø�I�I�I�Ið”K×%Ò%Ø=ØœØÔ-ñôðð ”JÔ&Ð3Ô3°qÑ8Ð3Ô3Ð3ð” ×!Ò!Ø9Ø”GØ*ñôðð ” Ô"Ð/Ô/°1Ñ4Ð/Ô/Ð/ð9 5ð 5r/có—|j}tt¦«}d}| ¦«D]ì}| |j¦«r|jjxjdz c_Œ7|dz }|j |j | f|f}||j }t|¦«|krtj||¦«Œ„|dkrH|d|ddkr0tj||¦«|jjxjdz c_ŒÒ|jjxjdz c_Œíd„| ¦«D¦«}| d„d¬¦«d„|D¦«S)u1 Select candidate URLs for scheduling, sorted by total number of requests first and by average duration second. Only the best ``per_domain_limit`` candidates per domain are retained: a domain can never schedule more than that (see urls_scheduled), so lower-ranked same-domain candidates are unschedulable. Frequency excluded URLs (min_retracing_interval) are dropped up front as well, since they never consume a schedule slot. This bounds peak memory to O(domains * per_domain_limit) instead of materializing and fully sorting every candidate — an attacker can inflate the candidate count with distinct cache-busting query strings, but they all collapse onto their own domain's small per-domain cap (CLPRO-3310 F-09). rrlcó—g|] }|D]}|‘ŒŒ Sr.r.)rŽÚheapÚentrys r0r�z*AutoTracer.urls_sorted..ôs%€ÐSÐSÐS ÈdÐSÐSÀU�eÐSÐSÐSÐSr/có—|dS)Nrr.)räs r0úz(AutoTracer.urls_sorted..õs €¨%°¬(€r/T)ÚkeyÚreversecó—g|]\}}|‘ŒSr.r.)rŽÚ_rIs r0r�z*AutoTracer.urls_sorted..ös€Ð-Ð-Ð-™˜˜3�Ð-Ð-Ð-r/)rÜrrerBr§r rgrDr:r$r!r%r‘ÚheapqÚheappushÚ heapreplacer<ÚvaluesÚsort)rirÜÚper_domain_bestÚorderrIrärãÚ candidatess r0rÛzAutoTracer.urls_sortedÉsƒ€ð Ô0Ðõ ,7µtÑ+<Ô+<ˆØˆØ×%Ò%Ñ'Ô'ð 5ð 5ˆCØ×(Ò(¨¬Ñ1Ô1ð ð” Ô"Ð,Ô,°Ñ1Ð,Ô,ØØ �Q‰JˆEØ”n cÔ&6¸¸Ð?ÀÐEˆEØ" 3¤>Ô2ˆDÝ�4‰yŒyÐ+Ò+Ð+Ý”˜t UÑ+Ô+Ð+Ð+Ø! AÒ%Ð%¨%°¬(°T¸!´W¸Q´ZÒ*?Ð*?õÔ! $¨Ñ.Ô.Ð.Ø” Ô"Ð/Ô/°1Ñ4Ð/Ô/Ð/ð” Ô"Ð/Ô/°1Ñ4Ð/Ô/Ð/ØSÐS¨×(>Ò(>Ñ(@Ô(@ÐSÑSÔSˆ Ø�ŠÐ2Ð2¸DˆÑAÔAÐAØ-Ð- *Ð-Ñ-Ô-Ð-r/có,—t¦«|_dS)z6 Fill internal list of disabled users N)r)ris r0rÙz!AutoTracer.fill_in_disabled_usersøs€õ-Ñ.Ô.ˆÔÐÐr/cóD—|j�˜ ttd¦«5}tjt |j¦«|¦«ddd¦«dS#1swxYwYdS#t $r3}|j dt|¦«¦«Yd}~dSd}~wwxYwdS)zI Save collected statistics for current iteration to file NÚwz*Unable to save iteration stats to file: %s) rgÚopenrÚjsonÚdumprÚOSErrorrbÚwarningr+)riÚ stats_filer}s r0rzzAutoTracer.save_iteration_statsþs€ð Œ:Ð !ð ZÝÕ0°#Ñ6Ô6ð>¸*Ý”I�f T¤ZÑ0Ô0°*Ñ=Ô=Ð=ð>ð>ð>ñ>ô>ð>ð>ð>ð>ð>ð>ð>øøøð>ð>ð>ð>ð>ð>øåð Zð Zð ZØ” ×#Ò#Ð$PÕRUÐVWÑRXÔRXÑYÔYÐYÐYÐYÐYÐYÐYÐYøøøøð Zøøøð "Ð !s:‰A ž(AÁ A ÁAÁA ÁAÁA Á BÁ*(BÂBc óx— tt¦«5}tj|¦«}t |d|d|dt di|d¤Ž¦«}ddd¦«n #1swxYwYn6#t tjtf$rt |j ¦«}YnwxYwt|¦«S)z@ Load statistics for latest iteration from file r@rArBrDNr.) rörr÷Úloadr?r2rùÚJSONDecodeErrorÚKeyErrorr@r)rirûÚ_dataÚ stat_datas r0Úload_iteration_statszAutoTracer.load_iteration_stats sÿ€ð 2ÝÕ,Ñ-Ô-ð °Ýœ  *Ñ-Ô-�Ý!ؘ/Ô*ØÐ*Ô+ؘ/Ô*Ý Ð4Ð4 5¨Ô#3Ð4Ð4ñ ô� ð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð øøõ�Ô-­xÐ8ð 2ð 2ð 2ݘdÔ0Ñ1Ô1ˆIˆIˆIð 2øøøå�iÑ Ô Ð s5‚A7–A A+Á A7Á+A/Á/A7Á2A/Á3A7Á70B*Â)B*c óÌ—| ¦«}| tt¦«dt t ¦«¦«¬¦«¦«|S)rMr)rÚdisabled_users_quantity)rÚupdateÚdictrr‘r)riÚ stats_loadeds r0Ú get_statszAutoTracer.get_statssS€ð×0Ò0Ñ2Ô2ˆ Ø×Ò�D­©¬°¬ ÍSÕQ_ÑQaÔQaÑMbÔMbÐcÑcÔcÑdÔdÐdØÐr/)N)rJN)&r'r(r)r*r_r~Ú staticmethodrr€r+r ÚobjectrƒrÈr‰r-r”rerŸr§r°rr¹r¾rÄrÉr rrÖrBrwrrÛrÙrzrrÚ __classcell__)rjs@r0r[r[lsø€€€€€ððð=ð=ð=ð=ð=ð=ð#$ð#$ð#$ð#$ð#$ðJðN�tðNðNðNñ„\ðNð ð1 Sð1¨X°fÔ-=ð1ð1ð1ñ„\ð1ð¨#ð°$ððððð5¨sð5ð5ð5ð5ð  ð  ¨H°T¬Nð  Àdð  ð  ð  ð  ð°ð¸ððððð*¨dðÀtðÐPTðððððI¸À#¼ðIÈ4ðIðIðIðIð D¸XÀc¼]ðDÈtðDðDðDðDð G¸XÀd¼^ð GÐ]að GÐfjð Gð Gð Gð G𨰬ð¸4ðððððS¨x¸¬}ðSðSðSðSðjð¨X°d¬^ðÀxÐPSÄ}ððððð265 ¨¤ ð65ð65ð65ð65ðp-.˜T #œYð-.ð-.ð-.ð-.ð^/ð/ð/ð/ð Zð Zð Zð Zð! dð!ð!ð!ð!ð"˜4ððððððððr/r[có†—tj tj t¦«d¦«S)a=Absolute path of the standalone auto-tracer log. Always resolves inside the fixed, root-owned clos_ssa log directory (derived from ``autotracing_log``) rather than against the caller's cwd, so the destination cannot be redirected by the directory the dev entry point happens to be launched from. zauto_tracer_standalone.log)rprQÚjoinÚdirnamerr.r/r0Ústandalone_log_pathr"s)€õ Œ7�<Š<�œŸš­Ñ8Ô8Ð:VÑ WÔ WÐWr/Úlog_pathcóº—tj|tjtjztjztjzd¦«}tj|d¦«S)aOpen ``log_path`` for appending and return the file object. Uses ``O_NOFOLLOW`` so a symlink pre-planted at the target is refused rather than followed: the open raises instead of appending through the link to an arbitrary root-owned file. i Úa)rpröÚO_WRONLYÚO_CREATÚO_APPENDÚ O_NOFOLLOWÚfdopen)rÚlog_fds r0Úopen_standalone_logr-sA€õŒW�X�rœ{­R¬ZÑ7½"¼+ÑEÍÌ ÑUÐW\Ñ ]Ô ]€FÝ Œ9�V˜SÑ !Ô !Ð!r/Ú__main__)ÚstreamÚlevel)Dr*rdrër÷r`rpÚ collectionsrÚ dataclassesrrrrrÚfnmatchr Útypingr r r r rrÚ urllib.parserÚnumpyr«Ússa.dbrÚssa.internal.exceptionsrÚssa.modules.commonrÚssa.modules.storagerrÚssa.autotracingrrrÚssa.configurationrÚssa.configuration.schemesrÚssa.internal.constantsrrÚssa.internal.utilsrrsÚxray.shared_libraryÚshared_libraryroÚ ImportErrorr}rr2r?rFr+rYr[rrr'Ú basicConfigÚDEBUGr¤r.r/r0úr1s¼ðððð€ à € € € Ø € € € Ø€€€Ø € € € Ø#Ð#Ð#Ð#Ð#Ð#Ø0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ø(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ØÐÐÐÐÐØGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGØ!Ð!Ð!Ð!Ð!Ð!àÐÐÐà!Ð!Ð!Ð!Ð!Ð!Ø,Ð,Ð,Ð,Ð,Ð,Ø%Ð%Ð%Ð%Ð%Ð%ØGÐGÐGÐGÐGÐGÐGÐGØKÐKÐKÐKÐKÐKÐKÐKÐKÐKØ+Ð+Ð+Ð+Ð+Ð+ØAÐAÐAÐAÐAÐAØJÐJÐJÐJÐJÐJÐJÐJØ*Ð*Ð*Ð*Ð*Ð*àÐðØ*Ð*Ð*Ð*Ð*Ð*Ð*øØðððØÐØ€H€H€H€H€H€Høøøøðøøøð  ð ð ð ð ð ñ ô ñ „ð ð ð ð ð ð ð ñ ô ñ „ð ð  ð@ð@ð@ð@ð@ñ@ô@ñ „ð@ðððððˆ:ñôðð &�3ð &˜4ð &ð &ð &ð &ðsðsðsðsðs�ñsôsðsðl X˜SðXðXðXðXð" #ð"ð"ð"ð"ð ˆzÒÐØ€K�M„M€Mð€GÔÐ2Ð2Ð3FÐ3FÑ3HÔ3HÑIÔIÐQXÔQ^Ð_Ñ_Ô_Ð_؈ ‰ Œ €AØ€A�C„C€C€C€CðÐsÂBÂB(ÂB#Â#B(