%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /opt/alt/python37/lib/python3.7/site-packages/ssa/modules/__pycache__/
Upload File :
Create Path :
Current File : //opt/alt/python37/lib/python3.7/site-packages/ssa/modules/__pycache__/autotracer.cpython-37.pyc

B

r�bjJ�@s�dZdZddlZddlZddlmZddlmZmZm	Z	ddl
m
Z
mZddlm
Z
ddlmZmZmZmZdd	lmZddlZd
dlmZdd
lmZmZmZddlmZddlm Z ddl!m"Z"ddl#m$Z$m%Z%yddl&m'Z(Wne)k
r�dZ(YnXeGdd�d��Z*eGdd�d��Z+eGdd�d��Z,Gdd�de�Z-e.e-d�dd�Z/Gdd�de�Z0e1dk�r�e%�ej2d ej3d!�e0�Z4e4�dS)"z'
This module contains Autotracer class
zssa.modules�N)�defaultdict)�	dataclass�field�asdict)�datetime�	timedelta)�fnmatchcase)�Iterator�Optional�
NamedTuple�List)�urlparse�)�Common�)�status�disabled_users�is_edition_supported)�
load_tunables)�autotracing_tunables_schema)�autotracing_stats_file)�is_xray_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.pyr(s
rc@s~eZdZUdZdZeed<dZeed<dZeed<dZ	eed<dZ
eed<dZeed<dZeed	<dZ
eed
<dZeed<dS)
�RulesRejectszRejects counters containerr�non_wp�	throttled�density�slowness�disabled�nginx�	frequency�server_limit�domain_limitN)r!r"r#r$r+r'r&r,r-r.r/r0r1r2r3r(r(r(r)r*4s
r*c@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&r6r'r7rr*r9r(r(r(r)r4Bs

r4c@s"eZdZUdZeed<eed<dS)�URLSz"
    Representation of an URL
    �domain_name�uri_pathN)r!r"r#r$r%r&r(r(r(r)r:Ks
r:)�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�splitr:)r=�	fragments�qsrZ_no_www_netlocZ_no_port_netlocr(r(r)�	url_splitSsrJcspeZdZdZ�fdd�Z�fdd�Zeed�dd��Zee	e
ed	�d
d��Ze	e
d�d
d�Zed�dd�Zd6e
eed�dd�Ze	e
d�dd�Zeee
d�dd�Zee
d�dd�Ze
eee
d�dd �Ze
e
e
d!�d"d#�Zeeed$�d%d&�Zd7e
eeed'�d(d)�Zeed�d*d+�Zeed�d,d-�Zdd�d.d/�Zdd�d0d1�Z ed�d2d3�Z!ed�d4d5�Z"�Z#S)8�
AutoTracerz0
    SSA autotracing module implementation.
    cs>t���t�d�|_|j�dt�t�|_t�|_	d|_
dS)NZauto_tracerzAutoTracer enabled: %s)�super�__init__�logging�	getLogger�logger�info�__package__�listr�
tasks_list�stats)�self)�	__class__r(r)rMfs
zAutoTracer.__init__cst�s|j�d�dSt�s,|j�d�dStdkrD|j�d�dStj}|dk	�r|j�d�t���|j�d|j	�t
|j�|_xz|�
�D]n}|j�d|j�|jjd7_y||j|jd�Wq�tk
r�}z|j�d	t|��Wdd}~XYq�Xq�W|��dS)
Nz*AutoTracer skipped: unsupported CL editionz-AutoTracer skipped: unsupported X-Ray versionz*AutoTracer skipped: unable to import X-RayzAutoTracer startedzAutoTracer loaded config: %szStarting auto task for %sr)r=Z
tracing_countzFailed to start task: %s)rrPrQr�xray_libZstart_autotracingrLrM�debug�configr4r5rU�urls_scheduledrr7�request_number�	Exception�errorr%�save_iteration_stats)rVZ
start_toolr=�e)rWr(r)�__call__ns.

(zAutoTracer.__call__)r>cCs
tdt�S)z$
        Load configuration
        zautotracing.json)rrr(r(r(r)�	load_conf�szAutoTracer.load_conf)r;r>cCstdkrdSt�|�S)z;
        Gets domain info for the specified domain
        N)rX�domain_info)r;r(r(r)�gets_domaininfo�szAutoTracer.gets_domaininfo)�	user_namer>cCs"|jrtdkrdSt�|�jSdS)z>
        Says if nginx is enabled for a specific user
        NF)Z
skip_nginxrXZNginxUserCache�
is_enabled)rVrer(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)�lenrTrPrYZper_server_limit)rVZ
running_countr(r(r)�per_server_limit_recalculated�sz(AutoTracer.per_server_limit_recalculatedN)�	full_listr>csD|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)rjrk)�
n_days_agor(r)rl�sz1AutoTracer.excludes_old_tasks.<locals>.<listcomp>)rXrTrPrYr�nowrZmin_retracing_interval)rVror()rsr)�excludes_old_tasks�szAutoTracer.excludes_old_tasks)�current_urlr>cCs|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
        r=z2Skipped: URL %s was traced recently. Matched by %sTF)rJrTr;r<rrPrY)rVrv�cZ	task_data�tZdirect_matchZwildcard_matchr(r(r)�exclude_thesame_urls�szAutoTracer.exclude_thesame_urls)�url_total_reqs�domain_total_reqsr>cCs4|jr0t�t�||��}|j�d|�||jkSdS)z-Check that URL density passes given thresholdzCalculated density %sT)r-�npZaminZcorrcoefrPrYZdensity_threshold)rVrzr{Zurl_densityr(r(r)�pass_by_density�s
zAutoTracer.pass_by_density)�
url_durationsr>cCs0d|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
        �dzCalculated %sth percentile %s)Zslow_duration_percentager|Z
percentilerPrYZslow_duration_threshold)rVr~Zreversed_percentileZreversed_percentile_valuer(r(r)�pass_by_slowness_percentile�s
z&AutoTracer.pass_by_slowness_percentile)�url_throttled_reqsrzr>cCs8|dkrdSt|�t|�d}|j�d|�||jkS)zY
        Check that percent of throttled requests per URL passes given threshold
        NFrzCalculated throttled percent %s)�sumrPrYZallowed_throttling_percentage)rVr�rzZthrottled_percentr(r(r)�pass_by_allowed_throttling�s
z%AutoTracer.pass_by_allowed_throttling)�	wp_statusr>cCs|jrt|�SdS)zx
        Check that URLs of a particular domain should be analyzed.
        For now we skip non-wordpress sites
        T)Zonly_wp�bool)rVr�r(r(r)�pass_by_engine�szAutoTracer.pass_by_engine)�collected_statsr>c	#s��x�|��D�]�\}}d}��|�d��sp�j�d�t�fdd�|D��}�jjj|7_�jj	|7_	q�xD|��D�]6\}}|�j
kr�q|�j�d|��jj	d7_	��|�d�|d	�s�j�d
��jjjd7_q|��
|d	|d��s�j�d��jjjd7_q|��|d
��sL�j�d��jjjd7_q||dk�rv��|�}|dk�rpd}n|j}t|tt�|d
��t|d�t|d	�t|d
�||d�Vq|WqWdS)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
        NZis_a_wordpress_domainz Skipped by engine: non-wordpresscsg|]}|�jkr|�qSr()�non_url_fields)rj�u)rVr(r)rlsz<AutoTracer.urls_computationally_filtered.<locals>.<listcomp>zProcessing URL %srr�rzzSkipped by throttled percentr{zSkipped by densityZ	durationszSkipped by slowness percentile�unknownZ
url_slow_reqs)rrrrrr )�itemsr�rqrPrYrmrUr9r+r6r�r�r,r}r-r�r.rdrirr'r|Zmeanr��max)	rVr��domainZ	url_statsZdomain_ownerZ
skipped_countr=�datarcr()rVr)�urls_computationally_filteredsP








z(AutoTracer.urls_computationally_filtered)�stats_collectedr>ccs�|dkr"|��\}}|j�d|�|��xx|�|�D]j}|j|jkrj|j�d|j�|jjj	d7_	q6|�
|j�r�|j�d|j�|jjjd7_q6|Vq6WdS)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
        NzAutoTracer loaded data: %sz'Skipped: autotracing is disabled for %srz Skipped: nginx is enabled for %s)Z
load_statsrPrY�fill_in_disabled_usersr�r rrUr9r/rgr0)rVr��_r=r(r(r)r7Hs 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_sortedrPrYrurTrnryrrUr9r1rZper_domain_limitr3r2)rVZgeneral_tasks_counterZtasks_counter_per_domainZsorted_urlsZper_server_smart_limitr=r(r(r)r[hs.


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)r�r(r(r)�<lambda>��z(AutoTracer.urls_sorted.<locals>.<lambda>T)�key�reversecSs|jS)N)r)r�r(r(r)r��r�)�sortedrSr7)rVZfirst_serier(r(r)r��s
zAutoTracer.urls_sortedcCst�|_dS)z6
        Fill internal list of disabled users
        N)r)rVr(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)
rU�openr�json�dumpr�OSErrorrP�warningr%)rV�
stats_filer`r(r(r)r_�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
        r5r6r7r9N)r�rr��loadr4r*r��JSONDecodeError�KeyErrorr5r)rVr��_dataZ	stat_datar(r(r)�load_iteration_stats�s

zAutoTracer.load_iteration_statscCs*|��}|�tt�dtt��d��|S)r@r)rZdisabled_users_quantity)r��update�dictrrmr)rVZstats_loadedr(r(r)�	get_stats�s
zAutoTracer.get_stats)N)N)$r!r"r#r$rMra�staticmethodr�rbr%r
�objectrdr�rgr'rnrSruryr}r�r�r�r	rr�r7r[rr�r�r_r�r��
__classcell__r(r()rWr)rKas2
	
	H,
rK�__main__zauto_tracer_standalone.log)�filename�level)5r$rRr�rN�collectionsrZdataclassesrrrrr�fnmatchr�typingr	r
rr�urllib.parser
Znumpyr|�commonr�autotracingrrr�
configurationrZconfiguration.schemesr�internal.constantsr�internal.utilsrrZxray.shared_libraryZshared_libraryrX�ImportErrorrr*r4r:r%rJrKr!�basicConfig�DEBUGrxr(r(r(r)�<module>
sD
	k



Zerion Mini Shell 1.0