File: //usr/lib/python3/dist-packages/sos/__pycache__/utilities.cpython-38.pyc
U
f`gRN � @ sB d dl Z d dlZd dlZd dlZd dlmZmZmZ d dlZd dl Z d dl
Z
d dlZd dlZd dl
Z
d dlZd dlZd dlZd dlmZ d dlmZ zd dlmZ W n ek
r� d dlmZ Y nX e�d�ZdZd Zd
ddd
ddddddddddddddddddd gZd!d"� ZdGd$d%�Z d&d � Z!dHd(d�Z"d)d*� Z#d+d� Z$dId,d�Z%d-d� Z&dJd.d�Z'eddddddddddfd/d�Z(dKd0d�Z)dLd2d�Z*dMd4d�Z+e j,fd5d6�Z-d7d� Z.d8d� Z/d9d� Z0d:d� Z1d;d� Z2e j3d<�d=d�Z4d>d� Z5g fd?d�Z6G d@dA� dA�Z7G dBdC� dCej8�Z9G dDd� d�Z:G dEd
� d
�Z;G dFd� de<�Z=dS )N� N)�Popen�PIPE�STDOUT)�closing)�deque)�parse)�
parse_versionZsosFi, �TIMEOUT_DEFAULT�ImporterHelper�SoSTimeoutError�TempFileUtil�bold�file_is_binary�fileobj�find�get_human_readable�grep�
import_module�
is_executable�listdirr �path_exists�
path_isdir�path_isfile�path_islink� path_join�recursive_dict_values_by_key� shell_out�sos_get_command_output�tailc
C s� t �d�}zF|j| dd�\}}}|s*| W S t �dd|��d�}|� d|� �}|W S tk
r� } z"t�d| � d |� �� | W Y �S d
}~X Y nX d
S )z< Convert the version into a PEP440 compliant version scheme.z2^([0-9][0-9.]*(?:(?:a|b|rc|.post|.dev)[0-9]+)*)\+?� )�maxsplitz[+~]+�.�-�+zUnable to format z to pep440 format: N)�re�compile�split�sub�strip� Exception�log�debug)�verZpublic_version_re�_ZpublicZlocalZsanitized_localZpep440_version�err� r/ �//usr/lib/python3/dist-packages/sos/utilities.py�format_version_to_pep440A s �r1 Tc C s |rt | �}t|�S t| �S )z6 Converts the version to PEP440 format before parsing )r1 r )r, Zpep440Z
ver_pep440r/ r/ r0 �sos_parse_versionR s r2 c
C sH t | d��4}t�| �j|kr*|�| d� |�� W 5 Q R � S Q R X dS )z,Returns the last number_of_bytes of filename�rb� N)�open�os�stat�st_size�seek�read)�filenameZnumber_of_bytes�fr/ r/ r0 r [ s �rc C s\ t | t�rPzt| |dd�W S tk
rL t�d| � d�� tt�� � Y S X nt| �S dS )z@Returns a file-like object that can be used as a context manager�utf-8��encodingz fileobj: z could not be openedN) �
isinstance�strr5 �IOErrorr* r+ r �io�StringIO)Zpath_or_file�moder/ r/ r0 r c s
c C sH ddddd�}|� � D ]*\}}| |krt| �| d�|� � S q| � S )zCConverts a number of bytes to a shorter, more human friendly formatl i @� � )�T�G�M�Kz.1f)�items�float)Z num_bytesZsizesZsymbol�sizer/ r/ r0 �
convert_byteso s
rP c s� t rPz6t�| �� ddg}� jdko8t� fdd�|D �� W S tk
rN Y nX t| ddd��B}z|�d � W W 5 Q R � d
S tk
r� Y W 5 Q R � dS X W 5 Q R X dS )
az Helper to determine if a given file contains binary content or not.
This is especially helpful for `sos clean`, which cannot obfuscate binary
data and instead, by default, will remove binary files.
:param fname: The full path of the file to check binaryness of
:type fname: ``str``
:returns: True if binary, else False
:rtype: ``bool``
ztext/zinode/�binaryc 3 s | ]}� j �|�V qd S �N)Z mime_type�
startswith)�.0Z_mt�Z_ftupr/ r0 � <genexpr>� s z!file_is_binary.<locals>.<genexpr>Ztrr>