File: //opt/alt/python37/lib/python3.7/site-packages/ssa/internal/__pycache__/utils.cpython-37.pyc
B
�BgdL8 � @ s� d Z ddlZddlZddlZddlZddlZddlZddlm m Z
ddlmZ ddl
mZ ddlmZmZ ddlmZ ddlmZmZmZmZmZmZmZ ddlmZmZ dd lmZ ddlZdd
l m!Z! ddl"m#Z# ddl$m%Z% dd
l&m'Z' ddl(m)Z) ddl*m+Z+m,Z, ddl-m.Z. ddl/m0Z0 e�1d�Z2edddg�Z3e4e3d�dd�Z5dd�dd�Z6dVe4e7e4d�dd �Z8e4e4d!�d"d#�Z9e4d$d%�d&d'�Z:e4d�d(d)�Z;dWe4e4d+�d,d-�Z<e4d�d.d/�Z=e>e?d0�d1d2�Z@e4ee4 d3�d4d5�ZAee4 d�d6d7�ZBee4 d�d8d9�ZCe7d�d:d;�ZDe7d�d<d=�ZEe7d�d>d?�ZFe7dd@�dAdB�ZGe7d�dCdD�ZHe4d�dEdF�ZIe4ee4ef e7dG�dHdI�ZJdJdK� ZKedXe>ddL�dMdN��ZLedYe>e>e>ddQ�dRdS��ZMdPZNdTdU� ZOdS )Zz>
This module contains helpful utility functions for SSA Agent
� N)�
namedtuple)�contextmanager)�date� timedelta)�LooseVersion)�socket�fromfd�AF_UNIX�SOCK_STREAM�AF_INET�AF_INET6�
SOCK_DGRAM)�Optional�Union)�urlparse)�AtexitIntegration)�LoggingIntegration)�Feature)�is_panel_feature_supported)�get_kmodlve_module_version)�is_cl_solo_edition�is_container� )�
sentry_dsn)�SSAError�utils�URLZdomain_nameZuri_path)�url�returnc C sJ t | �}|jrd|j� �nd}|jr2|j� |� �nd}t|j�dd�|�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 �query�pathr �netloc�replace)r Z fragments�qs�uri� r( �C/opt/alt/python37/lib/python3.7/site-packages/ssa/internal/utils.py� url_split0 s r* )r c s� t t t d�dd�} dd� � � fdd�}dd �d
d�}ttjtjd�}t|d
�}tjt| d||gd� t� � �}d|� i|_
W dQ R X dS )u�
Initialize Sentry client
shutdown_timeout=0 disables Atexit integration as stated in docs:
'it’s easier to disable it by setting the shutdown_timeout to 0'
https://docs.sentry.io/platforms/python/default-integrations/#atexit
On the other hand, docs say, that
'Setting this value too low will most likely cause problems
for sending events from command line applications'
https://docs.sentry.io/error-reporting/configuration/?platform=python#shutdown-timeout
)�event�hintr c S s | d � ddi� | S )z�
Add extra data into sentry event
:param event: original event
:param hint: additional data caught
:return: updated event
�extrazssa.versionz
0.3-11.el9)�update)r+ r, r( r( r) �add_infoI s zsentry_init.<locals>.add_infoc S sT y0t | t��}|�|df� |�� d S Q R X W n tk
rN t�d� Y nX dS )aI
address_family - we can choose constants represent the address
(and protocol) families
(AF_INET for ipv4 and AF_INET6 for ipv6)
private_ip - specify some private ip address. For instance:
ipv4 -> 10.255.255.255 or ipv6 -> fc00::
r r NzCannot retrieve IP address)r r
�connect�getsockname� Exception�logger�info)Zaddress_familyZ
private_ip�sr( r( r) �
try_get_ipS s zsentry_init.<locals>.try_get_ipc s8 t dftdff} x"| D ]\}}� ||�}|r|S qW dS )zq
We are trying to get an IPv4 or IPv6 address.
In case of failure we'll return 127.0.0.1
z10.255.255.255zfc00::z 127.0.0.1)r r )Z
ipversionsZaddr_famZpriv_ip�ip)r6 r( r) �get_ipb s
zsentry_init.<locals>.get_ipN)r c S s d S )Nr( )�pending�timeoutr( r( r) �nopen � zsentry_init.<locals>.nope)�levelZevent_level)�callbackzalt-php-ssa@0.3-11.el9)ZdsnZbefore_send�releaseZintegrationsZ
ip_address)�dictr �logging�INFO�WARNINGr �
sentry_sdk�initr �configure_scope�user)r/ r8 r; Zsentry_loggingZ
silent_atexit�scoper( )r6 r) �sentry_init= s
rI F)�fname�as_errorr c
C s� y>t j| t jddd� yt�| d� W n tk
r: Y nX | S tk
r~ } z"t�|r^t j nt jdt
|�� W dd}~X Y nX dS )zz
Try to configure logging into given fname
If as_error True, log the exception as ERROR, otherwise -- as INFO
z%(asctime)s %(message)sz%m/%d/%Y %I:%M:%S %p)�filenamer= �format�datefmti� z$No logging configuration applied: %sN)rA �basicConfigrB �os�chmod�PermissionError�OSErrorr3 �log�ERROR�str)rJ rK �er( r( r) �set_logging_into_filez s
rX )�lognamer c
C sl t � t| �dkrhyt�tj�| �� W n2 tk
rZ } zt�dt |�� dS d}~X Y nX t| dd�} | S )zP
Configure logging
:param logname: path to log
:return: logpath
NzFailed to create logdir %sr T)rK )
rI rX rP �makedirsr# �dirnamer2 r3 �warningrV )rY rW r( r( r) �configure_logging� s r] z
socket object)�
sock_locationr c C s` t tj�dd��}|dkrHt� � tt�}|�| � |�� W dQ R X nt dtt
�}|�� |S )z�
Create world-writable socket in given sock_location
or reuse existing one
:param sock_location: socket address
:return: socket object
�
LISTEN_FDSr N� )�intrP �environ�get�umask_0r r �bind�listenr r
)r^ r_ Zsockobjr( r( r) �
create_socket� s
rg c C s t �� tdd� } | �d�S )zC
Returns date of previous day in a format "day.month.year"
r )�daysz%d.%m.%Y)r �todayr �strftime)Z yesterdayr( r( r) �previous_day_date� s rk �%d.%m.%Y)�datestrr c C s t j �| |�}|�d�S )z+
Convert date to format YYYY-mm-dd
z%Y-%m-%d)�datetime�strptimerj )rm Z formatstrZ_dater( r( r) �format_date� s rp c
C s� yHt �d�} | �� }|�d�j}t�� �}|�d|� W dQ R X |�d�S t t j
fk
r� } zt�dt
|�� W dd}~X Y nX dS )ze
Obtain system ID from /etc/sysconfig/rhn/systemid
:return: system ID without ID- prefix
z/etc/sysconfig/rhn/systemidz(.//member[name='system_id']/value/stringZ system_idNzID-z Failed to retrieve system_id: %s)�ET�parseZgetroot�find�textrD rF Zset_tag�lstriprS Z
ParseErrorr3 r\ rV )Ztree�rootZwhole_idrH rW r( r( r) �read_sys_id� s
rw )�durationr c C s t t| d d��S )zQ
Cast duration from microseconds to seconds leaving 2 digits after point
i@B z0.2f)�floatrM )rx r( r( r) �
duration_cast� s rz )�filepathr c C sV y$t | ��}|�� �� }W dQ R X W n tk
r8 dS X d�|�d�dd� �pTdS )zDGet version of package from file. alt-php-ssa/alt-php-xray supportedN�.� z0.0-0)�open�read�striprS �join�split)r{ Zv_file�versionr( r( r) �pkg_version� s
r� c C s t d�S )z"Get version of alt-php-ssa packagez/usr/share/clos_ssa/version)r� r( r( r( r) �ssa_version� s r� c C s t d�S )z#Get version of alt-php-xray packagez/usr/share/alt-php-xray/version)r� r( r( r( r) �xray_version� s r� c C s@ t � } | dkrdS yt| �td�kS ttfk
r: dS X dS )zb
Check version of alt-php-xray package.
Autotracing in X-Ray is supported since 0.4-1
NFz0.4-1)r� r � TypeError�AttributeError)Zversion_numberr( r( r) �is_xray_version_supported� s r� c
C sF d} t tt��.}y|�| � W n ttfk
r6 dS X W dQ R X dS )z Check if User Agent is listeningz$/opt/alt/php-xray/run/xray-user.sockFNT)r r r
r0 �ConnectionErrorrS )Zuser_agent_sockr5 r( r( r) �is_xray_user_agent_active� s r� c C sX d} t j�| �sdS y(t�| d��}t|�� �dkS Q R X W n tjk
rR dS X dS )z@Check if there are no active X-Ray tasks (== empty task storage)z/usr/share/alt-php-xray/tasksT�cr NF)rP r# �isfile�dbmr~ �len�keys�error)Zxray_tasks_storageZ
xray_tasksr( r( r) �no_xray_active_tasks s r� )�enabledr c
C s� t tj�sdS t�d| � y:tdddd��"}|�| r8dnd� t�d � W dQ R X W n4 tk
r� } zt�d
| t|�� W dd}~X Y nX dS )zb
Switch on/off throttle statistics gathering by kmodlve
:param enabled: True or False
NzSwitching schedstats: %sz!/proc/sys/kernel/sched_schedstats�wbr )�mode� buffering� 1� 0zDone OKz(Failed to set sched_schedstats to %s: %s) r r ZLVEr3 r4 r~ �writerS rV )r� �frW r( r( r) �switch_schedstats s
r� c C s0 t d�} t d�}t� }|r$t|| �S tt� |�S )z�
Check kmodlve module version or kernel version in order to determine
if it provides the detection of IO throttling
z2.0-23z1.5.58)r r �compare_versions_ge�extract_kernel_version)Zkmod_min_versionZkernel_min_versionZkmod_currentr( r( r) �$is_io_throttling_detection_available, s
r� c C s@ t �d�} t�� }y| �|��d�}W n tk
r: dS X |S )zO
Get kernel version in the form of "major-minor" from current platform
zlve([.0-9]*).elr z0.0.0)�re�compile�platformr? �search�groupr� )�patternr? Zversion_numr( r( r) r� 9 s
r� )�
first_version�second_versionr c
C sJ yt | �|kS tk
rD } ztd| � d|� d���W dd}~X Y nX dS )zE
Comparing two versions using the greater or equal operator.
zAUnable to compare required versions: unexpected versions format "z" and "�"N)r r� r )r� r� rW r( r( r) r� F s
r� c C s t dd�st� rdS t� S )zR
General check of kernel support (IO throttling availability is required)
T)�skip_jwt_check)r r r� r( r( r( r) �is_kernel_version_supportedQ s r� )�maskr c c s t �| �}dV t �|� dS )z,
Context manager for dropping umask
N)rP �umask)r� �prevr( r( r) rd ] s
rd r| T)�
target_uid�
target_gidr� r c c sd t �� }t �� }yt �|�}W n tk
r6 d}Y nX | dkrT|dkrN|} n|j} |dkrp|dkrj|}n|j}|dk r�t �|�}||kr�t �|� t �
d|� |r�t �� |kr�td��|| k�rt �
| � t �
d| � |�rt �� | k�r||kr�t �|� td��dV || k�r,t �
|� t �
d|� ||k�rLt �|� t �
d|� |dk �r`t �|� dS )aH
Context manager to drop privileges during some operation
and then restore them back.
If target_uid or target_gid are given, use input values.
Otherwise, stat target_uid and target_gid from given target_path.
If no target_path given, use current directory.
Use mask if given.
:param target_uid: uid to set
:param target_gid: gid to set
:param target_path: directory or file to stat for privileges,
default -- current directory
:param mask: umask to use
:param with_check: check the result of switching privileges
NzDropped GID privs to %sz6Unable to execute required operation: permission issuezDropped UID privs to %szRestored UID privs to %szRestored GID privs to %s)rP �getuid�getgid�statrS �st_uid�st_gidr� �setegidr3 �debug�getegidr �seteuid�geteuid) r� r� Ztarget_pathr� Z
with_checkZprev_uidZprev_gid� stat_infor� r( r( r) �set_privilegesg sN
r� c C s G dd� d�}|| �S )Nc @ s e Zd ZdZdd� Zdd� ZdS )zsingleton.<locals>.__Singletonzm
A singleton wrapper class. Its instances would be created
for each decorated class.
c S s || _ d | _d S )N)�_wrapped� _instance)�self�_clsr( r( r) �__init__� s z'singleton.<locals>.__Singleton.__init__c _ s"