← Back
Editing: utilities.cpython-38.pyc
U ��g�M � @ s< 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 dZdZd d ddd ddddddddddddddddddgZd d!� ZdJd#d$�Zd%d� ZdKd'd�Z dLd,d-�Z!d.d� Z"dMd/d�Z#d0d� Z$dNd1d�Z%eddddddddddfd2d�Z&dOd3d�Z'dPd5d�Z(dQd7d�Z)e j*fd8d9�Z+d:d� Z,d;d� Z-d<d� Z.d=d� Z/d>d� Z0e j1d?�d@d�Z2dAd � Z3g fdBd�Z4G dCdD� dD�Z5G dEdF� dFej6�Z7G dGd � d e8�Z9G dHd� d�Z:G dId� de;�Z<dS )R� N)�Popen�PIPE�STDOUT)�closing)�deque)�parse)� parse_versionFi, �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_pep440? 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_versionP 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 Y s �rc C sb t | t�rVzt| |�W S tk rR t�d�}|�d| � d�� tt� � � Y S X nt| �S dS )z@Returns a file-like object that can be used as a context managerZsosz fileobj: z could not be openedN) � isinstance�strr5 �IOError�loggingZ getLoggerr+ r �io�StringIO)Zpath_or_file�moder* r/ r/ r0 r a s � � � @� c C sb t | �}| |kr|| d�S | |kr0|| d�S | |krD|| d�S | |krX|| d�S | � S dS )zCConverts a number of bytes to a shorter, more human friendly formatz.1fTz.1fGz.1fMz.1fKN)�float)Zbytes_�K�M�G�T�fnr/ r/ r0 � convert_bytesn s rO c s� t rPz6t�| �� ddg}� jdko8t� fdd�|D �� W S tk rN Y nX t| d��B}z|�d� W W 5 Q R � dS tk r� Y W 5 Q R � d S X W 5 Q R X d S )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 FTN) � magic_mod�magicZdetect_from_filename�encoding�anyr) r5 r: �UnicodeDecodeError)�fnameZ_mimesZtfiler/ rT r0 r } s �� c c s� |r"t j�|��t jj�}||7 }t �|�D ]^\}}}|rV|�t jj�|krV|dd�= |rht�||�shq,t�|| �D ]}t j�||�V qtq,dS )z�Generator function to find files recursively. Usage:: for filename in find("*.properties", "/var/log/foobar"): print filename N) r6 �path�dirname�count�sep�walk�fnmatch�filter�join) Zfile_patternZtop_dirZ max_depthZpath_patternZ base_depthr\ �dirlistZfilelist�namer/ r/ r0 r � s c s>