File: //proc/thread-self/root/lib/python3/dist-packages/sos/__pycache__/utilities.cpython-38.pyc
U
��e�F �
@ s� d dl Z d dlZd dlZd dlmZmZmZ d dlZd dlZd dl Z d dl
Z
d dlZd dlZd dl
Z
d dlZd dlZd dlmZ d dlmZ zd dlmZ W n ek
r� d dlmZ Y nX dZdZd d
� ZdEdd
�ZdFdd�Zdd� ZdGdd�Z dd� Z!dHdd�Z"edddddddddf
dd�Z#dIdd�Z$dJd!d"�Z%dKd$d%�Z&e j'fd&d'�Z(d(d)� Z)d*d+� Z*d,d-� Z+d.d/� Z,d0d1� Z-e j.d2�d3d4�Z/d5d6� Z0g fd7d8�Z1d9d:� ZG d;d<� d<�Z2G d=d>� d>e
j3�Z4G d?d@� d@e5�Z6G dAdB� dB�Z7G dCdD� dDe8�Z9dS )L� N)�Popen�PIPE�STDOUT)�closing)�deque)�
parse_version)�parseFi, 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�f� r �//usr/lib/python3/dist-packages/sos/utilities.py�tail$ s r �rc C s^ t | t�rRzt| |�W S tk
rN t�d�}|�d| � tt� � � Y S X nt| �S dS )z@Returns a file-like object that can be used as a context managerZsoszfileobj: %s could not be openedN)
�
isinstance�strr �IOError�loggingZ getLogger�debugr �io�StringIO)Zpath_or_file�mode�logr r r �fileobj, s
r � � � @� c C sd t | �}| |krd|| S | |kr0d|| S | |krDd|| S | |krXd|| S d| S dS )zCConverts a number of bytes to a shorter, more human friendly formatz%.1fTz%.1fGz%.1fMz%.1fKz%dN)�float)Zbytes_�K�M�G�T�fnr r r �
convert_bytes9 s r+ 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 r � <genexpr>Z s z!file_is_binary.<locals>.<genexpr>Ztr� FTN) � magic_mod�magicZdetect_from_filename�encoding�any� Exceptionr r �UnicodeDecodeError)�fnameZ_mimesZtfiler r0 r �file_is_binaryH s
��
r: 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) r �path�dirname�count�sep�walk�fnmatch�filter�join) Zfile_patternZtop_dirZ max_depthZpath_patternZ
base_depthr; �dirlistZfilelist�namer r r �findj s
rE c
s>