HEX
Server: Apache
System: Linux zacp120.webway.host 4.18.0-553.50.1.lve.el8.x86_64 #1 SMP Thu Apr 17 19:10:24 UTC 2025 x86_64
User: govancoz (1003)
PHP: 8.3.26
Disabled: exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname
Upload Files
File: //opt/alt/python37/lib/python3.7/site-packages/ssa/modules/__pycache__/autotracer.cpython-37.pyc
B

V�d�S�
@s�dZdZddlZddlZddlZddlmZddlmZm	Z	m
Z
ddlmZmZddl
mZddlmZmZmZmZmZdd	lmZddlZdd
lmZddlmZdd
lmZmZm Z ddl!m"Z"m#Z#m$Z$ddl%m&Z&ddl'm(Z(ddl)m*Z*ddl+m,Z,m-Z-m.Z.dZ/yddl0m1Z2Wn,e3k
�rDZ4ze4Z/dZ2WddZ4[4XYnXeGdd�d��Z5eGdd�d��Z6eGdd�d��Z7Gdd�de�Z8e9e8d�dd�Z:Gdd �d e�Z;e<d!k�r�e.�ej=d"ej>d#�e;�Z?e?�dS)$z'
This module contains Autotracer class
zssa.modules�N)�defaultdict)�	dataclass�field�asdict)�datetime�	timedelta)�fnmatchcase)�Iterator�Optional�
NamedTuple�List�Iterable)�urlparse)�setup_database�)�Common)�iter_domains_data�iter_urls_data�get_url_durations�)�status�disabled_users�is_edition_supported)�
load_tunables)�autotracing_tunables_schema)�autotracing_stats_file)�is_xray_version_supported�is_kernel_version_supported�sentry_initc@sJeZdZUdZeed<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�r.r.�G/opt/alt/python37/lib/python3.7/site-packages/ssa/modules/autotracer.pyr2s
rc@s�eZdZUdZdZeed<dZeed<dZeed<dZ	eed<dZ
eed<dZeed<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*r1r-r,r2r3r4r5r6r7r8r9r:r;r.r.r.r/r0>s
r0c@sDeZdZUdZeed<dZeed<dZeed<e	e
d�Ze
ed<dS)	�StatszAutoTracer statistics container�
rules_versionr�urls_processed�
urls_selected)�default_factory�rejectsN)r'r(r)r*r+r,r>r-r?rr0rAr.r.r.r/r<Ns

r<c@s"eZdZUdZeed<eed<dS)�URLSz"
    Representation of an URL
    �domain_name�uri_pathN)r'r(r)r*r+r,r.r.r.r/rBWs
rB)�url�returncCs\t|�}|jrd|j��nd}|jr2|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�splitrB)rE�	fragments�qsr Z_no_www_netlocZ_no_port_netlocr.r.r/�	url_split_srRcs�eZdZdZd7�fdd�	Z�fdd�Zeed�dd	��Zee	e
ed
�dd��Ze	e
d
�dd�Zed�dd�Zd8e
eed�dd�Ze	e
d�dd�Zeee
d�dd�Zeee
d�dd�Zeee
d�dd�Ze
eee
d �d!d"�Ze
e
e
d#�d$d%�Zeed�d&d'�Zd9e
eeed(�d)d*�Zeed�d+d,�Zeed�d-d.�Z dd�d/d0�Z!dd�d1d2�Z"ed�d3d4�Z#ed�d5d6�Z$�Z%S):�
AutoTracerz0
    SSA autotracing module implementation.
    NcsNt���t�d�|_|j�dt�t�|_t�|_	d|_
|rB|nt�|_dS)NZauto_tracerzAutoTracer enabled: %s)
�super�__init__�logging�	getLogger�logger�info�__package__�listr�
tasks_list�statsr�engine)�selfr^)�	__class__r.r/rUrs
zAutoTracer.__init__csFt�s|j�d�dSt�s,|j�d�dSt�sB|j�d�dStdkrztj�d�rj|j�	dt
t��n|j�d�dStj}|dk	�r:|j�d�t
���|j�d|j�t|j�|_x||��D]p}|j�d	|j�|jjd
7_y||j|jd�Wq�tk
�r4}z|j�	dt
|��Wdd}~XYq�Xq�W|��dS)
Nz*AutoTracer skipped: unsupported CL editionz.AutoTracer skipped: unsupported kernel versionz-AutoTracer skipped: unsupported X-Ray versionz/opt/alt/php-xrayz1AutoTracer skipped: X-ray module import error: %sz'AutoTracer skipped: X-Ray not installedzAutoTracer startedzAutoTracer loaded config: %szStarting auto task for %sr)rEZ
tracing_countzFailed to start task: %s)rrXrYrr�xray_lib�osrL�exists�errorr+�xray_import_errorZstart_autotracingrTrU�debug�configr<r=r]�urls_scheduledr r?�request_number�	Exception�save_iteration_stats)r_Z
start_toolrE�e)r`r.r/�__call__|s8

(zAutoTracer.__call__)rFcCs
tdt�S)z$
        Load configuration
        zautotracing.json)rrr.r.r.r/�	load_conf�szAutoTracer.load_conf)rCrFcCstdkrdSt�|�S)z;
        Gets domain info for the specified domain
        N)ra�domain_info)rCr.r.r/�gets_domaininfo�szAutoTracer.gets_domaininfo)�	user_namerFcCs"|jrtdkrdSt�|�jSdS)z>
        Says if nginx is enabled for a specific user
        NF)Z
skip_nginxraZNginxUserCache�
is_enabled)r_rqr.r.r/�nginx_is_enabled�s
zAutoTracer.nginx_is_enabledcCs,tdd�|jD��}|j�d|�|j|S)z>Recalculate limit per server taking into account running taskscSs(g|] }|ddkr|ddkr|�qS)r�running�userz
*autotracing*r.)�.0�taskr.r.r/�
<listcomp>�sz<AutoTracer.per_server_limit_recalculated.<locals>.<listcomp>z&Number of running autotracing tasks %s)�lenr\rXrfZper_server_limit)r_Z
running_countr.r.r/�per_server_limit_recalculated�sz(AutoTracer.per_server_limit_recalculated)�	full_listrFcsD|dkrt��}|j�d|�t��t|jd���fdd�|D�S)zQ
        Excludes tasks older than N days from the general list of tasks
        NzTask list loaded %s)�dayscs8g|]0}|�d�dk	r |�d�ndt����kr|�qS)Z
createtimeNr)�getr-�	timestamp)rvrw)�
n_days_agor.r/rx�sz1AutoTracer.excludes_old_tasks.<locals>.<listcomp>)rar\rXrfr�nowrZmin_retracing_interval)r_r{r.)rr/�excludes_old_tasks�szAutoTracer.excludes_old_tasks)�current_urlrFcCs|t|�}xn|jD]d}t|d�}|j|jko6|j|jk}t|j|j�oRt|j|j�}|s\|r|j�d||d�dSqWdS)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
        rEz2Skipped: URL %s was traced recently. Matched by %sTF)rRr\rCrDrrXrf)r_r��cZ	task_data�tZdirect_matchZwildcard_matchr.r.r/�exclude_thesame_urls�szAutoTracer.exclude_thesame_urls)�url_total_reqs�domain_total_reqsrFcCs4|jr0t�t�||��}|j�d|�||jkSdS)z-Check that URL density passes given thresholdzCalculated density %sT)r3�npZaminZcorrcoefrXrfZdensity_threshold)r_r�r�Zurl_densityr.r.r/�pass_by_density�s
zAutoTracer.pass_by_density)�
url_durationsrFcCs0d|j}t�||�}|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)Zslow_duration_percentager��
percentilerXrfZslow_duration_threshold)r_r�Zreversed_percentileZreversed_percentile_valuer.r.r/�pass_by_slowness_percentile�s
z&AutoTracer.pass_by_slowness_percentilecCs*t�||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�Zmax_slow_duration_percentagerXrfZmax_slow_duration_threshold)r_r�Zpercentile_valuer.r.r/�pass_by_max_slowness_percentiles	z*AutoTracer.pass_by_max_slowness_percentile)�url_throttled_reqsr�rFcCs8|dkrdSt|�t|�d}|j�d|�||jkS)zY
        Check that percent of throttled requests per URL passes given threshold
        NFr�zCalculated throttled percent %s)�sumrXrfZallowed_throttling_percentage)r_r�r�Zthrottled_percentr.r.r/�pass_by_allowed_throttlings
z%AutoTracer.pass_by_allowed_throttling)�	wp_statusrFcCs|jrt|�SdS)zx
        Check that URLs of a particular domain should be analyzed.
        For now we skip non-wordpress sites
        T)Zonly_wp�bool)r_r�r.r.r/�pass_by_engineszAutoTracer.pass_by_enginec	cs�x
t|j�D�]�}d}|�|j�sZ|j�d�|j}|jjj	|7_	|jj
|7_
qtt|j|j
��}�x�t|j|j
t|����D�]|\}}||jkr�q�|j�d|�|jj
d7_
|�|�d�|d�s�|j�d�|jjjd7_q�|�|d|j��s&|j�d�|jjjd7_q�||}|�|��sZ|j�d	�|jjjd7_q�|�|��s�|j�d
�|jjjd7_q�|dk�r�|�|j
�}|dk�r�|j�d�|jjjd7_q�n|j}t|t t!�"|��t#|d�t#|d�t$|�|j
|d
�Vq�WqWdS)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 %srr�r�zSkipped by throttled percentzSkipped by densityzSkipped by slowness percentilez"Skipped by max slowness percentilez"Skipped by unavailable domain infoZ
url_slow_reqs)r!r#r$r"r%r&)%rr^r�Zis_a_wordpress_domainrXrf�urls_numberr]rAr1r>�dictrrCrr[�keysZnon_url_fieldsr�r}r2r�r�r3r�r4r�r5rpr;rurr-r�Zmeanr��max)	r_�domain_data�domain_ownerZ
skipped_countZdomain_url_durationsrE�dataZ	durationsror.r.r/�urls_computationally_filtered&sb	







z(AutoTracer.urls_computationally_filtered)�stats_collectedrFccs�|��xv|��D]j}|j|jkrF|j�d|j�|jjjd7_q|�	|j�rv|j�d|j�|jjj
d7_
q|VqWdS)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 %srz Skipped: nginx is enabled for %sN)�fill_in_disabled_usersr�r&rrXrfr]rAr6rsr7)r_r�rEr.r.r/r?|s	zAutoTracer.urls_selectedccs�d}tt�}|��}|j�d|�|��|_|��}x�|D]�}|�|j	�r^|j
jjd7_q:||kr�||j
|jkr�|d7}||j
d7<|Vq�|j�d|j	|j�|j
jjd7_q:|j�d|j	|�|j
jjd7_q:WdS)a=
        Schedule autotracing by sorted list taking into account the limits:
         - no same task for 10 days
         - limit per server
         - limit per domain
        ORDER OF RULES MUST NOT BE CHANGED: IT AFFECTS STATISTICS COUNTERS
        Return resulting list of URLs scheduled for auto tracing
        rzSorted scheduled list %srz#Skipped URL %s by domain limit (%s)z#Skipped URL %s by server limit (%s)N)rr-�urls_sortedrXrfr�r\rzr�r r]rAr8r%Zper_domain_limitr:r9)r_Zgeneral_tasks_counterZtasks_counter_per_domainZsorted_urlsZper_server_smart_limitrEr.r.r/rh�s.


zAutoTracer.urls_scheduledcCs,tt|���dd�dd�}t|dd�dd�S)zd
        Sort URLs by total number of requests first
        and by average duration second
        cSs|jS)N)r!)�ur.r.r/�<lambda>��z(AutoTracer.urls_sorted.<locals>.<lambda>T)�key�reversecSs|jS)N)r$)r�r.r.r/r��r�)�sortedr[r?)r_Zfirst_serier.r.r/r��s
zAutoTracer.urls_sortedcCst�|_dS)z6
        Fill internal list of disabled users
        N)r)r_r.r.r/r��sz!AutoTracer.fill_in_disabled_usersc
Csp|jdk	rly,ttd��}t�t|j�|�WdQRXWn4tk
rj}z|j�dt	|��Wdd}~XYnXdS)zI
        Save collected statistics for current iteration to file
        N�wz*Unable to save iteration stats to file: %s)
r]�openr�json�dumpr�OSErrorrX�warningr+)r_�
stats_filerlr.r.r/rk�s
 zAutoTracer.save_iteration_statsc
CsvyFtt��4}t�|�}t|d|d|dtf|d��}WdQRXWn&ttjtfk
rlt|j	�}YnXt
|�S)z@
        Load statistics for latest iteration from file
        r=r>r?rAN)r�rr��loadr<r0r��JSONDecodeError�KeyErrorr=r)r_r��_dataZ	stat_datar.r.r/�load_iteration_stats�s

zAutoTracer.load_iteration_statscCs*|��}|�tt�dtt��d��|S)rHr)rZdisabled_users_quantity)r��updater�rryr)r_Zstats_loadedr.r.r/�	get_stats�s
zAutoTracer.get_stats)N)N)N)&r'r(r)r*rUrm�staticmethodr�rnr+r
�objectrpr�rsr-rzr[r�r�r�r
r�r�r�r�r	rr�r?rhrr�r�rkr�r��
__classcell__r.r.)r`r/rSms4
%
	
	
W,
rS�__main__zauto_tracer_standalone.log)�filename�level)@r*rZr�rVrb�collectionsrZdataclassesrrrrr�fnmatchr�typingr	r
rrr
�urllib.parserZnumpyr�Zssa.dbr�commonrZstoragerrr�autotracingrrr�
configurationrZconfiguration.schemesr�internal.constantsr�internal.utilsrrrreZxray.shared_libraryZshared_libraryra�ImportErrorrlrr0r<rBr+rRrSr'�basicConfig�DEBUGr�r.r.r.r/�<module>
sP