Viewing File: /opt/hc_python/lib/python3.12/site-packages/psutil/__pycache__/_pslinux.cpython-312.pyc

�

`�*j3K�
�~�dZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlmZddlmZddlmZddlmZddlmZdd	lmZdd
lmZddlmZddlmZdd
lmZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm!Z!ddlm"Z"ddlm#Z#ddlm$Z$ddlm%Z%ddlm&Z&ddlm'Z'ddlm(Z(ddlm)Z)ddlm*Z*ddlm+Z+gd�Z,d Z-ej\j_d!ej`��d"��Z1ej\j_d!ej`��d#��Z2e3ed$�Z4e3ed%�Z5ejld&�Z7ejp�Z9ejtd'k(Z;e<�Z=d(Z>ej~d)d*e@e
j��i�ZBeBj�ZCGd+�d,ej~�ZDeE�j�eDj��ej�ej�ej�ej�ej�ej�ej�ej�ej�ej�ej�ej�d-�ZSej�ej�ej�ej�ej�ej�ej�ej�ej�ej�ej�d.�Z_d/�Z`d0�Zad1�Zbe$d2��Zc	ecd3�e_dej�Zdd8�Zgd9�Zhd:�Zie3ed;�rej�Zjej�Zkd<�Zld=�Zmd>�Znd?�Zod@�ZpdA�Zqej\j_dB�sej\j_dC�rdD�ZrndE�Zrej�ZsGdF�dGee�ZtGdH�dI�Zueu�Zvd\dJ�ZwdK�ZxdL�Zyej�Zzd]dM�Z{GdN�dO�Z|d]dP�Z}dQ�Z~dR�ZdS�Z�dT�Z�dU�Z�dV�Z�dW�Z�dX�Z�dY�Z�GdZ�d[�Z�y#ee$r,Zfe d4ef���ed5d6�d7d7d7�e_dYdZf[f��'dZf[fwwxYw)^zLinux platform implementation.�N)�defaultdict)�
namedtuple�)�_common)�_ntuples)�_psposix)�
_psutil_linux)�ENCODING)�NIC_DUPLEX_FULL)�NIC_DUPLEX_HALF)�NIC_DUPLEX_UNKNOWN)�AccessDenied)�
NoSuchProcess)�
ZombieProcess)�bcat)�cat)�debug)�decode)�get_procfs_path)�
isfile_strict)�memoize)�memoize_when_activated)�open_binary)�	open_text)�parse_environ_block)�path_exists_strict)�
supports_ipv6)�
usage_percent)�PROCFS_PATH�IOPRIO_CLASS_NONE�IOPRIO_CLASS_RT�IOPRIO_CLASS_BE�IOPRIO_CLASS_IDLE�CONN_ESTABLISHED�
CONN_SYN_SENT�
CONN_SYN_RECV�CONN_FIN_WAIT1�CONN_FIN_WAIT2�CONN_TIME_WAIT�
CONN_CLOSE�CONN_CLOSE_WAIT�
CONN_LAST_ACK�CONN_LISTEN�CONN_CLOSINGz/sys/class/power_supply�/proc/�/smaps�
/smaps_rollup�proc_ioprio_get�proc_cpu_affinity_get�
SC_CLK_TCK�littlei�
AddressFamily�AF_LINKc��eZdZdZdZdZdZy)�
IOPriorityrr��N)�__name__�
__module__�__qualname__r r!r"r#���@/opt/hc_python/lib64/python3.12/site-packages/psutil/_pslinux.pyr9r9ds�����O��O��r@r9)�R�S�D�T�t�Z�X�x�K�W�I�P)�01�02�03�04�05�06�07�08�09�0A�0Bc���t|t�sJ|��tj|�}|j	d�d}|jd�rt
|�s|dd}|S)zWrapper around os.readlink().�r�
 (deleted)N���)�
isinstance�str�os�readlink�split�endswithr)�paths rAr`r`�s`���d�C� �&�$�&� �
�;�;�t��D��:�:�f��a� �D��}�}�\�"�+=�d�+C��D�S�z���Kr@c�J�tjdtjdtjdi}||tjtjztjzz}|tjzr|jddd�}|jdd�}|S)zZConvert file's open() flags into a readable string.
    Used by Process.open_files().
    �r�wzw+�arzr+)r_�O_RDONLY�O_WRONLY�O_RDWR�O_APPEND�replace)�flags�	modes_map�modes   rA�file_flags_to_moderp�sz�����c�2�;�;��R�Y�Y��E�I��U�b�k�k�B�K�K�7�"�)�)�C�D�E�D��r�{�{���|�|�C��a�(���<�<��d�#�D��Kr@c��|jdd�}d}|rd|��}nd|�d�}tj|tj�S)z�Return True if the given name refers to a root device (e.g.
    "sda", "nvme0n1") as opposed to a logical partition (e.g.  "sda1",
    "nvme0n1p1"). If name is a virtual device (e.g. "loop1", "ram")
    return True.
    �/�!Tz/sys/block/z/device)rlr_�access�F_OK)�name�including_virtualrcs   rA�is_storage_devicerx�sL���<�<��S�!�D�����T�F�#���T�F�'�*��
�9�9�T�2�7�7�#�#r@c�D�t|�d��5}|j�j�dd}ddd�gd�}t�}|dk\r|j	d�|dk\r|j	d�|d	k\r|j	d
�td|�S#1swY�fxYw)z�Return a namedtuple of variable fields depending on the CPU times
    available on this Linux kernel version which may be:
    (user, nice, system, idle, iowait, irq, softirq, [steal, [guest,
     [guest_nice]]])
    Used by cpu_times() function.
    �/statrN)�user�nice�system�idle�iowait�irq�softirq��steal�	�guest�
�
guest_nice�	scputimes)r�readlinera�len�appendr)�procfs_path�f�values�fields�vlens     rA�_scputimes_ntupler��s���
��}�E�*�	+�q�����#�#�%�a�b�)��
,�
K�F��v�;�D��q�y��
�
�g���q�y��
�
�g���r�z��
�
�l�#��k�6�*�*�
,�	+�s�"B�B�/proczignoring exception on import: r�zuser system idle�c�d�|d}||jdd�z}	|d}|d}|d}	t	t��d	��}d}|5|D]C}	|	j�}	|	jd
�s�%|t|	j�d�z
}�E	ddd�|tz}||z
}
||z}|t|dz|�z}|
|z
}
|
|t|d
z|�z
z
}
t|
�S#t$r'}t|jd�d��|cYd}~Sd}~wwxYw#t$r|cYSwxYw#1swY��xYw)ayFallback for kernels < 3.14 where /proc/meminfo does not provide
    "MemAvailable", see:
    https://blog.famzah.net/2014/09/24/.

    This code reimplements the algorithm outlined here:
    https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/
        commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773

    We use this function also when "MemAvailable" returns 0 (possibly a
    kernel bug, see: https://github.com/giampaolo/psutil/issues/1915).
    In that case this routine matches "free" CLI tool result ("available"
    column).

    XXX: on recent kernels this calculation may differ by ~1.5% compared
    to "MemAvailable:", as it's calculated slightly differently.
    It is still way more realistic than doing (free + cached) though.
    See:
    * https://gitlab.com/procps-ng/procps/issues/42
    * https://github.com/famzah/linux-memavailable-procfs/issues/2
    �MemFree:�Cached:rs
Active(file):sInactive(file):�
SReclaimable:zW is missing from /proc/meminfo; using an approximation for calculating available memoryNz	/zoneinfoslowrr:g@)
�get�KeyErrorr�argsrr�OSError�strip�
startswith�intra�PAGESIZE�min)�mems�free�fallback�lru_active_file�lru_inactive_file�slab_reclaimable�errr��
watermark_low�line�avail�	pagecaches            rA�calculate_avail_vmemr��sj��<���D��d�h�h�z�1�-�-�H�	��/�0�� �!3�4��� 0�1����?�,�-�Y�7�8���M�	
��D��:�:�<�D����v�&���T�Z�Z�\�!�_�!5�5�
��
�
�X��M��=� �E��"3�3�I�
��Y��]�M�2�2�I�	�Y��E�	�
��$4�s�$:�M� J�
J�J�E��u�:���1��
��x�x��{�m�>�
>�	
������������
��s@�C"�D�'D&�.!D&�"	D�+D
�D�
D�D#�"D#�&D/c
���g}i}tt��d��5}|D])}|j�}t|d�dz||d<�+	ddd�|d}|d}	|d}	|d
}||j
dd�z
}	|d
}		|d}
	|d}	|d}	|d}
|
dk(rt|�}
	|
dkrd}
|jd�n|
|kDr|}
||
z
}t||
z
|d��}|rMdjdj|�t|�dk(rdnd�}tj|td� �tj ||
||||
||||	|�S#1swY��xYw#t$rd}|jd	�Y��wxYw#t$rd}|jd�Y��"wxYw#t$r-	|d}	n"#t$rd}	|jd�YnwxYwY��UwxYw#t$rd}
|jd�Y��rwxYw#t$r9	|d|dz|dz}n"#t$rd}|jd�YnwxYwY���wxYw#t$rd}Y���wxYw#t$rt|�}
Y���wxYw)!a7Report virtual memory stats.
    This implementation mimics procps-ng-3.3.12, aka "free" CLI tool:
    https://gitlab.com/procps-ng/procps/blob/
        24fd2605c51fccc375ab0287cec33aa767f06718/proc/sysinfo.c#L778-791
    The returned values are supposed to match both "free" and "vmstat -s"
    CLI tools.
    �/meminfor�rNs	MemTotal:r�sBuffers:�buffersr�r��cachedsShmem:s
MemShared:�sharedsActive:�actives	Inactive:sInact_dirty:sInact_clean:sInact_laundry:�inactivesSlab:s
MemAvailable:�	available��round_z6{} memory stats couldn't be determined and {} set to 0z, �was�werer:��
stacklevel)rrrar�r�r�r�r�r�format�joinr��warnings�warn�RuntimeWarning�ntp�svmem)�missing_fieldsr�r�r�r��totalr�r�r�r�r�r��slabr��used�percent�msgs                 rA�virtual_memoryr�2s����N�
�D�	��)�*�(�3�	4���D��Z�Z�\�F�!�&��)�n�t�3�D����O��
5�
���E����D�)��{�#��
0��j�!��	�$�(�(�+�Q�/�/��,��i���(��j�!��
.���%����H�~��
/��%�&���A�:�
)��.�E��q�y������k�*�	������5�=�D��U�U�]�U�1�=�G��F�M�M��I�I�n�%���(�A�-�E�6�
��	�
�
�c�>�a�8��9�9�
�
������������Q
5�	4���)������i�(�)���(������h�'�(���,�	,��-�(�F���	,��F��!�!�(�+�	,��,���(������h�'�(���	.�	.��_�%���'�(��(�)�*�
��
�	.��H��!�!�*�-�	.��	.���������+�$�T�*��+�s��/E�E�$F�?F$�G�H�I�I�E�E>�=E>�F!� F!�$	G�.F4�3G�4G�G�G�G�G�G=�<G=�	I�
H�I�H;�8I�:H;�;I�I�I�I�I/�.I/c��i}tt��d��5}|D])}|j�}t|d�dz||d<�+	ddd�	|d}|d}||z
}t||d��}		tt��d	��}|5dx}
}|D]r}|jd
�r$t|jd�d�dzdz}
n4|jd
�r#t|jd�d�dzdz}|
��o|��rn(d}|dz
}tj|td��dx}
}ddd�tj||||	
�S#1swY��xYw#t$r*tj�\}}}}}}}||z}||z}Y��0wxYw#1swY�fxYw#t$r0}
d|
�d�}tj|td��dx}
}Yd}
~
��d}
~
wwxYw)zReturn swap memory metrics.r�rr�rNs
SwapTotal:s	SwapFree:r�z/vmstatspswpin� �spswpoutz,'sin' and 'sout' swap memory stats couldn't zbe determined and were set to 0r:r�zM'sin' and 'sout' swap memory stats couldn't be determined and were set to 0 (�))rrrar�r��cext�
linux_sysinforr�r�r�r�r�r��sswap)r�r�r�r�r�r��_�unit_multiplierr�r��sin�soutr�r�s              rA�swap_memoryr��s��
�D�	��)�*�(�3�	4���D��Z�Z�\�F�!�&��)�n�t�3�D����O��
5� ��]�#���L�!���4�<�D��D�%��2�G���?�,�-�W�5�6�����C�$����?�?�9�-��d�j�j��.�q�1�2�Q�6��=�C��_�_�Z�0��t�z�z�$�/��2�3�a�7�$�>�D��?�t�'7���E���8�8���
�
�c�>�a�@����d�%�&�9�9�U�D�$���d�;�;�c
5�	4��� �37�3E�3E�3G�0��1�a��E�4��
�� ������ ��&�Q����
0�03�u�A�
7�	�	�
�
�c�>�a�8����d���sN�/E
�
E�0F�A5F�>F�*F�
E�/F
�F
�F�	G�%&G�G�	heap_infoc�V�t�}t|�d��5}|j�j�}ddd�dt	t
jj�dz}|D�cgc]}t|�tz��}}tj|�S#1swY�cxYwcc}w)z�Return a named tuple representing the following system-wide
    CPU times:
    (user, nice, system, idle, iowait, irq, softirq [steal, [guest,
     [guest_nice]]])
    Last 3 fields may not be available on all Linux kernel versions.
    rzNr)
rrr�rar�r�r��_fields�float�CLOCK_TICKS)r�r�r�r�rIs     rA�	cpu_timesr��s���"�#�K�	��}�E�*�	+�q�����#�#�%��
,�
�A��C�M�M�1�1�2�Q�6�
7�F�.4�
5�f��e�A�h��$�f�F�
5��=�=�&�!�!�	
,�	+��6s�B�-B&�B#c��t�}g}t|�d��5}|j�|D]�}|jd�s�|j	�}|dttjj�dz}|D�cgc]}t|�tz��}}t
j|�}|j|���|cddd�Scc}w#1swYyxYw)zfReturn a list of namedtuple representing the CPU times
    for every CPU available on the system.
    rzscpurN)rrr�r�rar�r�r�r�r�r�r�)r��cpusr�r�r�r�rI�entrys        rA�
per_cpu_timesr�s���"�#�K�
�D�	��}�E�*�	+�q�	�
�
���D����v�&��������C��
�
�(=�(=�$>��$B�C��:@�A�&�Q�%��(�[�0�&��A��
�
�v�.�����E�"�
��
,�	+��B�
,�	+�s#�'C�=C�C�(C�C�Cc��	tjd�S#t$r�d}tt	��d��5}|D]'}|j�j
d�s�#|dz
}�)	ddd�n#1swYnxYw|dk(rttjd�}tt	��d��5}|D]-}|jd	�d}|j|�s�)|dz
}�/	ddd�n#1swYnxYw|dk(rYy|cYSwxYw)
z0Return the number of logical CPUs in the system.�SC_NPROCESSORS_ONLNr�/cpuinfos	processorrNzcpu\drz� )r_�sysconf�
ValueErrorrr�lowerr��re�compilerra�match)�numr�r��searchs    rA�cpu_count_logicalr�s�����z�z�/�0�0������
�O�-�.�h�7�
8�A����:�:�<�*�*�<�8��1�H�C��9�
8�
8���!�8��Z�Z��)�F��o�/�0��6�7�1��D��:�:�c�?�1�-�D��|�|�D�)��q����8�7�7���!�8���
�-�sP��!D�%A/�A/�&	D�/A8	�47D�++C(�C(�	D�(C1	�-D�;D�?Dc���t�}d}d}tj|�xstj|�D]C}t|�5}|j|j	�j��ddd��Et
|�}|dk7r|Si}i}tt��d��5}|D]f}|j�j�}|s	|d||d<i}�2|jd�s�D|jd	d
�\}	}
t|
�||	<�h	ddd�t|j��}|xsdS#1swY��xYw#t$rY�zwxYw#1swY�DxYw)z-Return the number of CPU cores in the system.z9/sys/devices/system/cpu/cpu[0-9]*/topology/core_cpus_listz?/sys/devices/system/cpu/cpu[0-9]*/topology/thread_siblings_listNrr��	cpu cores�physical id)r�r�s	:r)�set�globr�add�readr�r�rr�r�r�rar��sumr�)�ls�p1�p2rcr��result�mapping�current_infor��key�values           rA�cpu_count_coresr�4sW��

��B�
E�B�	J�B��	�	�"�
�.����2��.��
��
�!��F�F�1�6�6�8�>�>�#�$��
�/���W�F�
��{��
��G��L�	��)�*�(�3�	4���D��:�:�<�%�%�'�D���<H�$�=�G�L��8�9�
 "�����!?�@�!�Z�Z���2�
��U�$'��J��S�!��
5�"����!�
"�F��>�T��7�
��$ �����
5�	4�sB�	.E�-&E�E�E�4%E�E	�	E�E�E�E�E&c���tt��d��5}d}d}d}|D]�}|jd�rt|j	�d�}n[|jd�rt|j	�d�}n-|jd�rt|j	�d�}|���|���|���nddd�d}tj|�S#1swY�#xYw)z*Return various CPU stats as a named tuple.rzNsctxtrsintrssoftirqr)rrr�r�rar��	scpustats)r��ctx_switches�
interrupts�soft_interruptsr��syscallss      rA�	cpu_statsr^s���	��)�*�%�0�	1�Q����
����D����w�'�"�4�:�:�<��?�3������)� �����a��1�
�����,�"%�d�j�j�l�1�o�"6���(�#�/��*���	
2�"�H��=�=��z�?�H�M�M�%
2�	1�s�BC�/C�2C�5C�C#c
��tt��d��5}|D�cgc]?}|j�jd�rt	|jdd�d���Ac}cddd�Scc}w#1swYyxYw)z7Return current CPU frequency from cpuinfo if available.r�scpu mhz�:rN)rrr�r�r�ra)r�r�s  rA�_cpu_get_cpuinfo_freqruss��	��)�*�(�3�	4���
����z�z�|�&�&�z�2�
�$�*�*�T�1�%�a�(�)��
�
5�	4��
�
5�	4�s�A1�AA,� A1�,A1�1A:z'/sys/devices/system/cpu/cpufreq/policy0z$/sys/devices/system/cpu/cpu0/cpufreqc	��t�}tjd�xstjd�}|jd���g}tjj
}t
|�D�]\}}t|�t|�k(r	||dz}nt||d�d��}|�`t||d	�d��}|�Jd
|�d�}t|d��dk(r'|jtjd
d
d
����d}t|��t|�dz}tt||d���dz}	tt||d���dz}
|jtj||
|	����|S)z�Return frequency metrics for all CPUs.
        Contrarily to other OSes, Linux updates these values in
        real-time.
        z,/sys/devices/system/cpu/cpufreq/policy[0-9]*z)/sys/devices/system/cpu/cpu[0-9]*/cpufreqc�\�ttjd|�j��S)Nz[0-9]+)r�r�r��group�rIs rA�<lambda>zcpu_freq.<locals>.<lambda>�s���R�Y�Y�y�!�%<�%B�%B�%D�!Er@)r�i��scaling_cur_freqN�r��cpuinfo_cur_freqz/sys/devices/system/cpu/cpuz/onlinez0
r�z!can't find current frequency file�scaling_max_freq�scaling_min_freq)rr��sortr_rcr��	enumerater�rrr�r��scpufreq�NotImplementedErrorr�)�
cpuinfo_freqs�paths�ret�pjoin�irc�curr�online_pathr��max_�min_s           rA�cpu_freqr�sn��
.�/�
��	�	�:�
�D�
�Y�Y�B�
C�	�	�
�
�E�
�F��������� ��'�G�A�t��5�z�S��/�/�%�Q�'�$�.���E�$�(:�;�d�K���|��E�$�(:�;�d�K���<�$?��s�'�"J�K��;��6�%�?��
�
�3�<�<��S�#�#>�?� �=�C�-�c�2�2��t�9�t�#�D��t�E�$�(:�;�<�=��D�D��t�E�$�(:�;�<�=��D�D��J�J�s�|�|�D�$��5�6�-(�.�
r@c�f�t�D�cgc]}tj|dd���c}Scc}w)z}Alternate implementation using /proc/cpuinfo.
        min and max frequencies are not available and are set to None.
        r�)rr�rrs rArr�s/��4I�3J�K�3J�a����Q��S�)�3J�K�K��Ks�.c��eZdZy)�_Ipv6UnsupportedErrorN)r<r=r>r?r@rAr"r"�s��r@r"c�^�eZdZdZd�Zd�Zd�Zed��Zed
d��Z	ed
d��Z
d
d	�Zy)�NetConnectionsawA wrapper on top of /proc/net/* files, retrieving per-process
    and system-wide open connections (TCP, UDP, UNIX) similarly to
    "netstat -an".

    Note: in case of UNIX sockets we're only able to determine the
    local endpoint/path, not the one it's connected to.
    According to [1] it would be possible but not easily.

    [1] http://serverfault.com/a/417946
    c��dtjtjf}dtjtjf}dtjtjf}dtjtjf}dtj
df}|||||f||f|f|f||f|f|f|f||||f||f||fd�|_d|_y)N�tcp�tcp6�udp�udp6�unix)�allr&�tcp4r'r(�udp4r)r*�inet�inet4�inet6)�socket�AF_INET�SOCK_STREAM�AF_INET6�
SOCK_DGRAM�AF_UNIX�tmap�_procfs_path)�selfr,r'r-r)r*s      rA�__init__zNetConnections.__init__�s����v�~�~�v�'9�'9�:�������);�);�<���v�~�~�v�'8�'8�9�������):�):�;�������-���$��d�D�1��$�<��G��G��$�<��G��G��G��4��t�,��D�\��D�\�
��	�!��r@c��tt�}tj|j�d|�d��D]Y}	t|j�d|�d|���}|j
d�s�3|dddd}||j|t|�f��[|S#ttf$rY�ot$rU}|jtjk(rYd}~��|jtjk(rt|�Yd}~�Ƃd}~wwxYw)Nrr�/fd�/fd/zsocket:[r����)r�listr_�listdirr8r`r�r�r��FileNotFoundError�ProcessLookupErrorr��errno�EINVAL�ENAMETOOLONGr)r9�pid�inodes�fd�inoder�s      rA�get_proc_inodeszNetConnections.get_proc_inodes�s����T�"���*�*�� 1� 1�2�!�C�5��<�=�B�
9� �D�$5�$5�#6�a��u�D���!E�F�� �#�#�J�/�!�!�"�I�c�r�N�E��5�M�(�(�#�s�2�w��8�+>�,�
��'&�'9�:�
���
��9�9����,���9�9�� 2� 2�2��#�J����
�s)�B�D�$D�,C<�(C<�;C<�<Dc��i}t�D]#}	|j|j|���%|S#ttt
f$rY�>wxYw�N)�pids�updaterJrArB�PermissionError)r9rGrFs   rA�get_all_inodeszNetConnections.get_all_inodes�sT�����6�C�

��
�
�d�2�2�3�7�8���
��&�'9�?�K�
��
�s� 5�A�Ac
�$�|jd�\}}t|d�}|sy|jd�}|tjk(r`t
r0tj|tj|�ddd��}n�tj|tj|��}n�tj|�}	t
rMtjtjtjdgtjd|�����}nLtjtjtjdgtjd|�����}t!j"||�S#t$rt�std��wxYw)	a�Accept an "ip:port" address as displayed in /proc/net/*
        and convert it into a human readable form, like:

        "0500000A:0016" -> ("10.0.0.5", 22)
        "0000000000000000FFFF00000100007F:9E49" -> ("::ffff:127.0.0.1", 40521)

        The IP address portion is a little or big endian four-byte
        hexadecimal number; that is, the least significant byte is listed
        first, so we need to reverse the order of the bytes to convert it
        to an IP address.
        The port is represented as a two-byte hexadecimal number.

        Reference:
        http://linuxdevcenter.com/pub/a/linux/2000/11/16/LinuxAdmin.html
        �:�r?�asciiNr>z>4Iz<4I)rar��encoder1r2�
LITTLE_ENDIAN�	inet_ntop�base64�	b16decoder4�struct�pack�unpackr�rr"r��addr)r]�family�ip�ports    rA�decode_addresszNetConnections.decode_address
s<��"�:�:�c�?���D��4��}����
�Y�Y�w�
���V�^�^�#���%�%�f�f�.>�.>�r�.B�4�R�4�.H�I���%�%�f�f�.>�.>�r�.B�C���!�!�"�%�B�
� ��)�)�������E�E�F�M�M�%��,D�E��B�
 �)�)�������E�E�F�M�M�%��,D�E��B��x�x��D�!�!���
�$��/�T�9��	
�s
�>BE3�3FNc#�K�|jd�r tjj|�syt	|�5}|j�t
|d�D]�\}}	|j�dd\
}}	}
}}}}}}}||vr||d\}}nd	\}}|�||k7r�B|tjk(r
t|}ntj}	tj!|	|�}	tj!|
|�}
||||	|
||f����	ddd�y#t$rd|�d|�d|��}
t|
�d�wxYw#t"$rY��wxYw#1swYyxYw�w)
z.Parse /proc/net/tcp* and /proc/net/udp* files.�6Nrr��error while parsing �; malformed line r�r�Nr>)rbr_rc�existsrr�rrar��RuntimeErrorr1r3�TCP_STATUSESr�	CONN_NONEr$rar")�filer^�type_rG�
filter_pidr��linenor�r��laddr�raddr�statusrIr�rFrHs                rA�process_inetzNetConnections.process_inet=sx�����=�=���b�g�g�n�n�T�&:��
�t�_��
�J�J�L� )�!�Q�����	6��
�
��S�b�)�B�A�u�e�V�Q��1�a��E��F�?�%�U�m�A�.�G�C��&�G�C���)�j�C�.?���� 2� 2�2�!-�f�!5��!(�!2�!2��!� .� =� =�e�V� L�� .� =� =�e�V� L���v�u�e�U�F�C�H�H�C!0��_��"�6�.�t�f�5�"�8�1�T�H�.��'�s�+��5�6��41�!� �!��C�_�sY�=E�#E�#D�A
E�,D3�8
E�	E�!D0�0E�3	D?�<E�>D?�?E�E�Ec
#��K�t|�5}|j�|D]�}|j�}	|dd\}}}}}}}	|	|vr||	}ndg}|D]]\}}
|�||k7r�t|�dk(r|d	nd
}t
jt|��}d
}tj}|
||||||f���_��	ddd�y#t$rd|vrY��d|�d|��}
t	|
��wxYw#1swYyxYw�w)zParse /proc/net/unix files.r�r�rdrerfNr�r>�)
rr�rar�rhr�r�socktype_to_enumr�rj)rkr^rGrmr�r��tokensr�rlrIr��pairsrFrHrcrprqs                 rA�process_unixzNetConnections.process_unixhs$�����t�_��
�J�J�L��������	,�28��1�+�/�A�q�!�Q��q�%��F�?�#�5�M�E�'�L�E�$�G�C��!�-�*��2C� �-0��[�A�-=�v�b�z�2�� '� 8� 8��U�� D��!#��!(�!2�!2��!�6�5�$��v�s�K�K� %�%��_��"�,��$�� �.�t�f�4E�d�X�N��'�s�+�+�,��
�_�s@�C/�&C#�
B=�A1C#�4	C/�=
C �
C#�C � C#�#C,�(C/c�6�t�|_|�|j|�}|sgS|j�}t	�}|j
|D]�\}}}|j�d|��}|tjtjhvr|j|||||��}	n|j||||��}	|	D]S\}
}}}}}
}|rtj|
|||||
�}ntj|
|||||
|�}|j|��U��t|�S)Nz/net/)rm)rr8rJrPr�r7r1r2r4rrryr��pconn�sconnr�r?)r9�kindrFrGr�
proto_namer^rlrcr�rHrorprq�	bound_pid�conns                rA�retrievezNetConnections.retrieve�s+��+�-����?��)�)�#�.�F���	��(�(�*�F��e��)-���4��%�J����'�'�(��j�\�:�D��&�.�.�&�/�/�:�:��&�&��&�%��C�'����&�&�t�V�V��&�L��FH�B��F�E�5�%�����9�9�R����u�f�M�D��9�9��F�E�5�%����D�����
�GI�*9� �C�y�r@rL)r<r=r>�__doc__r:rJrP�staticmethodrarrryr�r?r@rAr$r$�s^��	�!�.�4� �0"��0"�d�(I��(I�T�!L��!L�Fr@r$c�,�tj|�S)z$Return system-wide open connections.)�_net_connectionsr�)r}s rA�net_connectionsr��s���$�$�T�*�*r@c��tt��d��5}|j�}ddd�i}ddD]�}|jd�}|dkDsJt	|���|d|j�}||dzdj�j
�}tt|�\}}}	}
}}}
}}}}}}}}}|||||	||
|f||<��|S#1swY��xYw)zsReturn network I/O statistics for every network interface
    installed on the system as a dict of raw tuples.
    z/net/devNr:rRrr)	rr�	readlines�rfind�reprr�ra�mapr�)r��lines�retdictr��colonrvr��
bytes_recv�packets_recv�errin�dropin�_fifoin�_framein�
_compressedin�_multicastin�
bytes_sent�packets_sent�errout�dropout�_fifoout�_collisionsout�_carrierout�_compressedouts                       rA�net_io_countersr��s��
�o�'�(��1�	2�a����
��
3��G��a�b�	���
�
�3����q�y�$�$�t�*�$�y��F�U�|�!�!�#���e�a�i�k�"�(�(�*�0�0�2��*
��V��'	
�����������������
��������	
���
�7�J�N�Q
3�	2�s�C	�	Cc�0�tjttjttj
ti}t�j�}i}|D]y}	tj|�}tj|�}tj|�\}}dj|�}d|v}	tj|	|||||�||<�{|S#t$r3}
|
j t j"k7r�t%|
�Yd}
~
��d}
~
wwxYw)z)Get NIC stats (isup, duplex, speed, mtu).�,�runningN)r��DUPLEX_FULLr�DUPLEX_HALFr�DUPLEX_UNKNOWNr
r��keys�
net_if_mtu�net_if_flags�net_if_duplex_speedr�r��	snicstatsr�rC�ENODEVr)�
duplex_map�namesrrv�mturm�duplex�speed�output_flags�isupr�s           rA�net_if_statsr��s���	
���/����/����/��J�

��"�"�$�E�
�C���	��/�/�$�'�C��%�%�d�+�E� �4�4�T�:�M�F�E��8�8�E�?�L���%�D��
�
��j��(�%��l��C��I�� �J���	��y�y�E�L�L�(���#�J�J��		�s�AC�	D�")D�Dc�|�d�}d�}tjjt��d��r|�}n?tjjd�r|�}nt��d�}t	|��i}|D]=}|\
}}}	}
}}}
}}}|st|�s�|
tz}
|tz}||	|
|||
|||f	||<�?|S)zcReturn disk I/O statistics for every disk installed on the
    system as a dict of raw tuples.
    c3�(K�tt��d��5}|j�}ddd�D]�}|j�}t	|�}|dk(r2|d}t|d�}t
t
|dd�\
}}}	}
}}}
}}}nl|dk(s|dk\r%|d}t
t
|dd�\}}}}	}
}}}
}}}n=|dk(r(|d}t
t
|dd�\}}}
}d	x}	x}
x}x}}nd
|��}t|��|||
|||	|
|||f
����y#1swY��xYw�w)N�
/diskstats�r;r:r���rtrznot sure how to interpret line )rrr�rar�r�r�r�)r�r�r�r��flenrv�reads�reads_merged�rbytes�rtime�writes�
writes_merged�wbytes�wtimer��	busy_timer�s                 rA�read_procfsz%disk_io_counters.<locals>.read_procfs	sV����"�/�+�,�J�7�
8�A��K�K�M�E�9��D��Z�Z�\�F��v�;�D��r�z��a�y���F�1�I���69�#�v�a��|�6L�4��v�u�f�m��E�1�i�����t�r�z��a�y��69�#�v�a��|�6L�4���f�e�V�]��E�1�i������a�y��03�C�����0D�-��v�v�v�KL�L��L��L��L�}�y�7��x�@�� ��o�%�������u���	�;�
;�/�9�
8�s�D�D�CD�D�Dc3�,K�tjd�D]�}tjtjj	d|��D]�\}}}d|vr�ttjj	|d��5}|j
�j�j�}ddd�tjj|�}ttdd�\
}}}	}
}}}
}}}||||	|
|
||||f
������y#1swY�YxYw�w)N�
/sys/block�statr�)r_r@�walkrcr�rr�r�ra�basenamer�r�)�block�rootr��filesr�r�rvr�r�r�r�r�r�r�r�r�s                rA�
read_sysfsz$disk_io_counters.<locals>.read_sysfs7s������Z�Z��-�E�"$�'�'�"�'�'�,�,�|�U�*K�"L���a����&���r�w�w�|�|�D�&�9�:�a��V�V�X�^�^�-�3�3�5�F�;��w�w�'�'��-��47�s�F�3�B�K�3H�1���f�e�V�]��E�1�i��U�F�F�F�E��l�M�9�F�F�#M�.�;�:�s�BD�-D�0AD�D�
Dr�r�z6/diskstats nor /sys/block are available on this system)r_rcrgrrrx�DISK_SECTOR_SIZE)�perdiskr�r��genr�r�r�rvr�r�r�r�r�r�r�r�r�s                 rA�disk_io_countersr�s���
+;�\F�
�w�w�~�~��*�+�:�6�7��m��	������	%��l��� �!�"�
�	�"�#�&�&��G���).�	&��u�f�f�f�e�U�L��9��0��6�
��"�"���"�"�������u�%�}�i�A���
�)�0�Nr@c�6�eZdZdZddgZd�Zd�Zd�Zd�Zd�Z	y	)
�RootFsDeviceFinderaFdisk_partitions() may return partitions with device == "/dev/root"
    or "rootfs". This container class uses different strategies to try to
    obtain the real device path. Resources:
    https://bootlin.com/blog/find-root-device/
    https://www.systutorials.com/how-to-find-the-disk-where-root-is-on-in-bash-on-linux/.
    �major�minorc��tjd�j}tj|�|_tj|�|_y�Nrr)r_r��st_devr�r�)r9�devs  rAr:zRootFsDeviceFinder.__init__ws3���g�g�c�l�!�!���X�X�c�]��
��X�X�c�]��
r@c���tt��d��5}|j�ddD]�}|j�}t	|�dkr�"|dj�rt
|d�nd}|dj�rt
|d�nd}|d}||jk(s�}||jk(s��|s��d|��ccddd�S	ddd�y#1swYyxYw)Nz/partitionsr:r�rrr;�/dev/)	rrr�rar��isdigitr�r�r�)r9r�r�r�r�r�rvs       rA�ask_proc_partitionsz&RootFsDeviceFinder.ask_proc_partitions|s���
�/�+�,�K�8�
9�Q����
�a�b�)��������v�;��?��*0��)�*;�*;�*=��F�1�I��4��*0��)�*;�*;�*=��F�1�I��4���a�y���D�J�J�&�5�D�J�J�+>��!&�t�f�~�-�:�
9�)�:�
9�
9�s$�BC�(C�8C�;C�C�Cc��d|j�d|j�d�}t|�5}|D]H}|jd�s�|j	�jd�d}|s�:d|��ccddd�S	ddd�y#1swYyxYw)Nz/sys/dev/block/rRz/ueventzDEVNAME=r:r�)r�r�rr�r��
rpartition)r9rcr�r�rvs     rA�ask_sys_dev_blockz$RootFsDeviceFinder.ask_sys_dev_block�sv�� �����A�d�j�j�\��A��
�t�_�����?�?�:�.��:�:�<�2�2�:�>�q�A�D��!&�t�f�~�-��_���_�_�s�B�$B�&B�6B�B
c��|j�d|j��}tjd�}|D]�}	t	|�}|5|j�j
�}||k(rLtjjtjj|��}d|��cddd�cS	ddd���y#1swY��xYw#t$rY��wxYw)NrRz/sys/class/block/*/devr�)r�r�r��iglobrr�r�r_rcr��dirnamerA)r9�needler�rkr��datarvs       rA�ask_sys_class_blockz&RootFsDeviceFinder.ask_sys_class_block�s����J�J�<�q�����-���
�
�3�4���D�	
.��d�O����6�6�8�>�>�+�D��v�~�!�w�w�/�/�������0E�F��!&�t�f�~�	�Q�%��Q�
��Q��%�
��
�s�C�A$C�C		�	C�Cc��d}|�	|j�}|�	|j�}|�	|j	�}|�"t
jj|�r|Syy#t$r}t|�Yd}~�dd}~wwxYw#t$r}t|�Yd}~�rd}~wwxYw#t$r}t|�Yd}~��d}~wwxYwrL)r�r�rr�r�r_rcrg)r9rcr�s   rA�findzRootFsDeviceFinder.find�s������<�
��/�/�1���<�
��-�-�/���<�
��/�/�1��
�������t� 4��K�!5����
��c�
�
��
��
�
��c�
�
��
��
�
��c�
�
��
�sE�A!�B�B#�!	A?�*A:�:A?�	B �B�B �#	C�,B<�<CN)
r<r=r>r��	__slots__r:r�r�r�r�r?r@rAr�r�ms,����'�"�I�#�
.�.�
.�r@r�c�(�t�}t�}|s�t|�d��5}|D]n}|j�}|j	d�s |j|j���D|j
d�d}|dk(s�^|jd��p	ddd�|dk(r?tjjd�r tjjd�}n"tjj|�d	��}g}tj|�}|D]b}	|	\}
}}}|
d
k(rd}
|
dvrt�j�xs|
}
|s|
r||vr�:tj |
|||�}
|j#|
��d|S#1swY��xYw)
z8Return mounted disk partitions as a list of namedtuples.z/filesystems�nodev�	r�zfsNr�z	/etc/mtabz/self/mounts�noneru>�	/dev/root�rootfs)r�rrr�r�r�rar_rc�isfile�realpathr��disk_partitionsr�r�r��	sdiskpartr�)r+�fstypesr�r�r��fstype�mounts_path�retlist�
partitions�	partition�device�
mountpoint�opts�ntuples              rAr�r��sf���e�G�!�#�K��
�+��l�3�
4�����z�z�|�����w�/��K�K��
�
��-�"�Z�Z��-�a�0�F�������E�*��5��g��"�'�'�.�.��"=��g�g�&�&�{�3���g�g�&�&�+��l�'C�D���G��%�%�k�2�J��	�+4�(��
�F�D��V���F��,�,�'�)�.�.�0�:�F�F���V�7�2�����v�z�6�4�@�����v�� ��N�?5�
4�s�A F�F�Fc	��tjt�}tjd�}|j	tjd��t|D�chc]}|j
d�d��c}�}tjd�}tjd�}|D]*}|jd|�}||vs�|j|��,|D]�}	|dz}tt|��d	z}	tjjtjj!|�d
�}t#|�j%�}
t|dzd�
�}t|dzd�
�}t#|dzd�
�j%�}
|�	t|�d	z}|�	t|�d	z}||
j|
|	||f���|�s�tjd�}tt+|��}|D�]�}	tjj|d�}tt|��d	z}	tjj|d�}t#|�j%�}
tj|dz�}|D�chc]B}djtjj/|�j
d�dd���D}}d}d}|D]�}tjj||dz�}t#|d�
�j%�}|dk(r/ttjj||dz�d�
�}n3|dk(r.ttjj||dz�d�
�}|�	t|�d	z}|���	t|�d	z}��||
jd|	||f����t1|�Scc}w#t&t(f$rY��wxYw#t($rd}Y��UwxYw#t($rd}Y��VwxYw#t&t(f$r}t-|�Yd}~��2d}~wwxYwcc}w#t($rd}Y��wxYw#t($rd}Y��~wxYw)a�Return hardware (CPU and others) temperatures as a dict
    including hardware name, label, current, max and critical
    temperatures.

    Implementation notes:
    - /sys/class/hwmon looks like the most recent interface to
      retrieve this info, and this implementation relies on it
      only (old distros will probably use something else)
    - lm-sensors on Ubuntu 16.04 relies on /sys/class/hwmon
    - /sys/class/thermal/thermal_zone* is another one but it's more
      difficult to parse
    z/sys/class/hwmon/hwmon*/temp*_*z&/sys/class/hwmon/hwmon*/device/temp*_*r�rz5/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*z'/sys/devices/platform/coretemp.*/hwmon/z/sys/class/hwmon/�_inputg@�@rv�_maxNr�_crit�_labelruz /sys/class/thermal/thermal_zone*�temp�typez/trip_point*r;�_type�critical�_temp�high)�collectionsrr?r��extend�sortedrar�r��subr�r�rr_rcr�r�rr�r�r�r�rr��dict)r�	basenamesrI�
basenames2�replrv�altname�baserc�current�	unit_namer	r�labelr��
trip_paths�p�trip_points�
trip_point�	trip_types                    rA�sensors_temperaturesr�s���
!�
!�$�
'�C��	�	�;�<�I����T�Y�Y�G�H�I���;��A������Q���;�<�I����?��J��:�:�@�A�D����(�(�.��5���)�#����T�"��
��	��(�?�D��D��J�'�&�0�G��7�7�<�<������� 5�v�>�D��D�	���)�I��D�6�M�D�1����w���6���D�8�O�b�1�7�7�9����
��T�{�V�+����
 � ��?�V�3��	�I����u�g�t�X�>�?�A�F��I�I�@�A�	��3�y�>�*�	��D�
��w�w�|�|�D�&�1����T�
�+�f�4���w�w�|�|�D�&�1����I�O�O�-�	�
���4�.�#8�9�J�$��#�A�������)�)�!�,�2�2�3�7��!�<�=�#�
���H��D�)�
��w�w�|�|�D�*�w�*>�?����r�2�8�8�:�	��
�*�#������T�:��+?�@�4� �H��&�(�������T�:��+?�@�4��D��#�$�$�T�{�V�3���'�(�#(��?�V�#;��'*�.
�	�N�!�!�2�w��h�"?�@�Q�T��9���A<��*��$�		�
�		��$�
���
��
�
 ���
 �� �Z�(�
��c�
���
��
��*&�$�#��$��
&�(�#'��(�s��O
�A2O�O%�!O7�<A0P	�AP1�P6�Q�O"�!O"�%O4�3O4�7P�P�	P.�P)�)P.�6Q�Q�Q�Qc��tjt�}tjd�}|stjd�}t	|D�chc]}|jd�d��c}�}|D]�}	t
t|dz��}ttjjtjj|�d��j�}t|dzd	�
�j�}||j!t#j$||����t'|�Scc}w#t$r}t|�Yd}~��d}~wwxYw)a�Return hardware fans info (for CPU and other peripherals) as a
    dict including hardware label and current speed.

    Implementation notes:
    - /sys/class/hwmon looks like the most recent interface to
      retrieve this info, and this implementation relies on it
      only (old distros will probably use something else)
    - lm-sensors on Ubuntu 16.04 relies on /sys/class/hwmon
    z/sys/class/hwmon/hwmon*/fan*_*z%/sys/class/hwmon/hwmon*/device/fan*_*r�rrNrvrrur)r
rr?r�rrar�rr�rrr_rcr�r�r�r�r��sfanr)rrrIrrr�rrs        rA�sensors_fansrZs���
!�
!�$�
'�C��	�	�:�;�I���I�I�E�F�	���;��A������Q���;�<�I���	��$�t�h��/�0�G�������R�W�W�_�_�T�%:�F�C�D�J�J�L�	��D�8�O�b�1�7�7�9���I����c�h�h�u�g�6�7����9���<���	��#�J���	�s�D5�7D:�:	E�E�Ec�l�
�t��
�
fd�}tjt�D�cgc]'}|j	d�sd|j�vr|��)}}|sytjjtt|��}||dz|dz�}||dz|dz�}||d	z|d
z�}||dz�}|�|�
	d|z|z}ntt|dzd���}|dk(ryd}	|tjjtd�tjjtd��}
|
�|
dk(}	n:t|dzd��j�j�}|dk(rd}	n|dvrd}	|	rtj}nV|�|�	t|t|�zdz�}n6|�$t|dz�}|dkr!tj }ntj }t#j$|||	�Scc}w#t$rd
}Y��$wxYw#t$rtj }Y�IwxYw)aReturn battery information.
    Implementation note: it appears /sys/class/power_supply/BAT0/
    directory structure may vary and provide files with the same
    meaning but under different names, see:
    https://github.com/giampaolo/psutil/issues/966.
    c���|D]"}t|���}|�k7s�	t|�cSy#t$r|j�cYcSwxYw)zvAttempt to read the content of multiple files which may
        not exist. If none of them exist return None.
        rN)rr�r�r�)rrcr�nulls   �rA�
multi_bcatz#sensors_battery.<locals>.multi_bcat�sR����D��t�d�+�C��d�{�'��s�8�O�	���"�'��9�9�;�&�'�s�
*�A�A�BAT�batteryNz/energy_nowz/charge_nowz
/power_nowz/current_nowz/energy_fullz/charge_fullz/time_to_empty_nowgY@r�z	/capacityr>rz
AC0/onlinez	AC/onliner�/statusru�dischargingF>�full�chargingTi�<r)�objectr_r@�POWER_SUPPLY_PATHr�r�rcr�r��ZeroDivisionErrorr�rr�r�POWER_TIME_UNLIMITED�abs�POWER_TIME_UNKNOWNr��sbattery)r#rI�batsr��
energy_now�	power_now�energy_full�
time_to_emptyr��
power_plugged�onlinerq�secsleftr"s             @rA�sensors_batteryr:ysM����8�D�����-�.��.�A��<�<���)�q�w�w�y�"8�	
�.�	��
���7�7�<�<�)�3�t�9�5�D��D�=�0�$��2F�G�J��4�,�.��~�0E�F�I��T�N�2�D�>�4I�J�K��t�&:�:�;�M���:�#9�	��j�(�;�6�G��c�$��,�r�:�;���b�=��
�M�
�
�����&��5�
�����&��4��F����!��
��T�I�%��3�9�9�;�A�A�C���]�"�!�M�
�+�
+� �M���/�/��	�	�I�$9�	2��:��I��6��=�>�H�
�	"��}�r�)�*���a�<��1�1�H��-�-���<�<���=�9�9��C��.!�	��G�	��B!�	2��1�1�H�	2�s)�,H�H�H�H�H�H3�2H3c��g}tj�}|D]8}|\}}}}}tj||xsd|||�}|j	|��:|S)z:Return currently connected users as a list of namedtuples.N)r��usersr��suserr�)	r��rawlist�itemr{�tty�hostname�tstamprF�nts	         rAr<r<�sY���G��j�j�l�G���+/�(��c�8�V�S�
�Y�Y�t�S�[�D�(�F�C�
@�����r����Nr@c��t��d�}t|�5}|D]H}|jd�s�t|j	�j�d�ccddd�Sd|��}t
|��#1swYyxYw)zAReturn the system boot time expressed in seconds since the epoch.rzsbtimerNzline 'btime' not found in )rrr�r�r�rarh)rcr�r�r�s    rA�	boot_timerE�sy����
 ��&�D�	�T�	�a��D����x�(��T�Z�Z�\�/�/�1�!�4�5�5�
�	��+�4�&�1���3���
�	�s�A7�+A7�&A7�7Bc��t�jt�}tj|�D�cgc]}|j�s�t
|��� c}Scc}w)z7Returns a list of PIDs currently running on the system.)rrUr
r_r@r�r�)rcrIs  rArMrM�sD����#�#�H�-�D��J�J�t�,�<�,�q��	�	��C��F�,�<�<��<s�A�
Ac�j�tj|�sy	t��d|�d�}t|�5}|D]?}|j	d�s�t|j
�d�}||k(ccddd�Sd|��}t|��#1swYyxYw#ttf$r|t�vcYSwxYw)zcCheck for the existence of a unix PID. Linux TIDs are not
    supported (always return False).
    Frrr&sTgid:rNz'Tgid' line not found in )
r�
pid_existsrrr�r�rar�r�rM)rFrcr�r��tgidr�s      rArHrH�s������s�#��	!�&�'�(��#��g�6�D��T�"�a��D����x�0�"�4�:�:�<��?�3�� $�s�{�*�
#�"��2�$��8�� ��o�%�#�"����$�	!��$�&�=� �	!�s:�B�B�"B�-	B�7B�B�
B�B�B2�1B2c�x�i}t�}t�D]g}	t|�d|�d��5}|j�}ddd�j	d�}||dzdj�}t
|d�}|||<�i|S#1swY�GxYw#ttf$rY��t$r}t|�|�d}~wwxYw)zsObtain a {pid: ppid, ...} dict for all running processes in
    one shot. Used to speed up Process.children().
    rrrzN�)r:r)rrMrr�r�rar�rArBrOr)	rr�rFr�r��rpar�dset�ppidr�s	         rA�ppid_maprOs���
�C�!�#�K��v��	���}�A�c�U�%�8�9�Q��v�v�x��:��:�:�d�#�D���q��
�#�)�)�+�D��t�A�w�<�D��C��H���J�:�9��!�#5�6�	���	-��s�#��,��	-�s3�B�B�B�B	�B�B9� B9�(B4�4B9c�B��tj���fd��}|S)z`Decorator which translates bare OSError exceptions into
    NoSuchProcess and AccessDenied.
    c���|j|j}}	�|g|��i|��S#t$r}t||�|�d}~wt$r"}|j�t
||�|�d}~wt$rR}|j�tjj|j�d|�d��s
t
||�|��d}~wwxYw)Nrrrz)rF�_namerOrrB�_raise_if_zombierrAr_rcrgr8)r9r��kwargsrFrvr��funs      �rA�wrapperz wrap_exceptions.<locals>.wrapper5s�����H�H�d�j�j�T��	��t�-�d�-�f�-�-���	3��s�D�)�s�2��!�	4��!�!�#���T�*��3�� �	��!�!�#��7�7�>�>�T�%6�%6�$7�q���U�"C�D�#�C��.�C�7���	�s+�'�	C�
=�C�	A&�&C�2A
B?�?C)�	functools�wraps)rUrVs` rA�wrap_exceptionsrY0s'���
�_�_�S�����$�Nr@c�L�eZdZdZgd�Zd�Zd�Zd�Zd�Ze	fd�Z
eed���Z
eed	���Zeed
���Zd�Zd�Zed
��Zed��Zed��Zed��Zed��Zej0j3dej4��d��red��Zed��Zed��Zed;d��Zed<d��Zed��Z e!se"rHd�Z#ee$jJd�e$jJd�e$jJd�fd��Z&ed ��Z'ne Z'e"red!��Z(ed"��Z)ee$jJd#�fd$��Z*ee$jJd%�fd&��Z+ed'��Z,ed(��Z-ed)��Z.e/r%ed*��Z0e$jJd+�fd,�Z1ed-��Z2e3red.��Z4ed/��Z5e6e7d0�r	ed;d1��Z8ed2��Z9ed3��Z:ed=d4��Z;ed5��Z<ed6��Z=ee$jJd7�fd8��Z>ee$jJd9�fd:��Z?y)>�ProcesszLinux process implementation.)�_cache�_ctimerR�_ppidr8rFc�Z�||_d|_d|_d|_t	�|_yrL)rFrRr^r]rr8)r9rFs  rAr:zProcess.__init__Ws)�������
���
����+�-��r@c��	t|j�d|j�d��}|jd�}||dz|dz}|dk(S#t$rYywxYw)NrrrzrKr:r;�ZF)rr8rFr�r�)r9r�rLrqs    rA�
_is_zombiezProcess._is_zombie^sk��	"��4�,�,�-�Q�t�x�x�j��>�?�D��:�:�d�#�D��$��(�T�A�X�.�F��T�>�!���	��	�s�%A�	A�Ac�z�|j�r+t|j|j|j��yrL)rbrrFrRr^�r9s rArSzProcess._raise_if_zombiens,���?�?������$�*�*�d�j�j�A�A�r@c�`�tj|j�d|j���y)z+Raise NSP if the process disappeared on us.rrN)r_r�r8rFrds rA�_raise_if_not_alivezProcess._raise_if_not_alivers&��	���4�$�$�%�Q�t�x�x�j�1�2r@c���	t|�S#ttf$rVtjj|j�d|j���r|j�|tur|cYS�wxYwr�)
r`rArBr_rc�lexistsr8rFrS�UNSET)r9rcr�s   rA�	_readlinkzProcess._readlinkxsh��	��D�>�!��!�#5�6�	��w�w���$�"3�"3�!4�A�d�h�h�Z�@�A��%�%�'��5�(�#�O��	�s�

�A!A2�0A2c��t|j�d|j�d��}|jd�}||j	d�dz|}||dzdj�}i}||d<|d	|d
<|d|d<|d|d
<|d|d<|d|d<|d|d<|d|d<|d|d<|d|d<	|d|d<|S#t$rtd�d	|d<Y|SwxYw)aYParse /proc/{pid}/stat file and return a dict with various
        process info.
        Using "man proc" as a reference: where "man proc" refers to
        position N always subtract 3 (e.g ppid position 4 in
        'man proc' == position 1 in here).
        The return value is cached in case oneshot() ctx manager is
        in use.
        rrrzrK�(rr:NrvrrqrNr��ttynr��utime��stime�
�children_utimer��children_stime��create_time�$�cpu_num�'�blkio_ticksz&can't get blkio_ticks, set iowait to 0)rr8rFr�r�ra�
IndexErrorr)r9r�rLrvr�rs      rA�_parse_stat_filezProcess._parse_stat_file�s3���t�(�(�)��4�8�8�*�E�:�;���z�z�$����D�I�I�d�O�a�'�$�/���d�Q�h�j�!�'�'�)������F���q�	��H�
��Q�i��F���a�y��G���b�z��G���b�z��G�� &�r�
���� &�r�
����#�B�Z��M������I��	#�!'���C�
���
���	#��:�;�!"�C�
���
�	#�s�4B>�>C�Cc��t|j�d|j�d��5}|j�cddd�S#1swYyxYw)z�Read /proc/{pid}/stat file and return its content.
        The return value is cached in case oneshot() ctx manager is
        in use.
        rrr&N)rr8rFr��r9r�s  rA�_read_status_filezProcess._read_status_file�s<���D�-�-�.�a����z��A�
B�a��6�6�8�C�
B�
B�s�A�A	c��t|j�d|j�d��5}|j�j	�cddd�S#1swYyxYw)Nrrr0)rr8rFr�r�r~s  rA�_read_smaps_filezProcess._read_smaps_file�sC���D�-�-�.�a����z��@�
A�Q��6�6�8�>�>�#�B�
A�
A�s�A�Ac��|jj|�|jj|�|jj|�yrL)r|�cache_activaterr�rds rA�
oneshot_enterzProcess.oneshot_enter�s>�����,�,�T�2����-�-�d�3����,�,�T�2r@c��|jj|�|jj|�|jj|�yrL)r|�cache_deactivaterr�rds rA�oneshot_exitzProcess.oneshot_exit�s>�����.�.�t�4����/�/��5����.�.�t�4r@c�:�t|j�d�S)Nrv)rr|rds rArvzProcess.name�s���d�+�+�-�f�5�6�6r@c�\�|j|j�d|j�d�d��S)Nrrz/exerur�rjr8rFrds rA�exezProcess.exe��5���~�~�� � �!��4�8�8�*�D�1�B��
�	
r@c��t|j�d|j�d��5}|j�}ddd�s|j	�gS|jd�rdnd}|j|�r|dd}|j
|�}|dk(r#t|�dk(rd|vr|j
d�}|S#1swY��xYw)Nrrz/cmdlinerZr�r>r)rr8rFr�rSrbrar�)r9r�r��sep�cmdlines     rAr�zProcess.cmdline�s���
�$�+�+�,�A�d�h�h�Z�x�@�
A�Q��6�6�8�D�B���!�!�#��I��
�
�f�-�f�3���=�=������9�D��*�*�S�/���&�=�S��\�Q�.�3�$�;��j�j��o�G���-B�
A�s�B9�9Cc��t|j�d|j�d��5}|j�}ddd�t	|�S#1swYt	�SxYw)Nrrz/environ)rr8rFr�r)r9r�r�s   rA�environzProcess.environ�sR��
�$�+�+�,�A�d�h�h�Z�x�@�
A�Q��6�6�8�D�B�"�4�(�(�B�"�4�(�(�s�A
�
Ac��t|j�d�}tj�}	||S#t$rYywxYw)Nrm)r�r|r�get_terminal_mapr�)r9�tty_nrr7s   rA�terminalzProcess.terminal�sI���T�*�*�,�W�5�6���(�(�*��	���<����	��	�s�7�	A�Ar/�/ioc	��|j�d|j�d�}i}t|�5}|D]8}|j�}|s�	|j	d�\}}t|�||<�:	ddd�|s|�d�}t|��	tj|d|d|d|d|d	|d
�S#t$rY��wxYw#1swY�WxYw#t$r(}|jd�d|�d
|��}t
|�d�d}~wwxYw)Nrrr�s: z file was emptyssyscrssyscws
read_bytesswrite_bytessrcharswcharrz field was not found in z; found fields are )r8rFrr�rar�r�rhr��pior�r�)	r9�fnamer�r�r�rvr�r�r�s	         rA�io_counterszProcess.io_counterss8���(�(�)��4�8�8�*�C�8�E��F��U�#�q��D��:�:�<�D��6�*.�*�*�U�*;�K�D�%�
,/�u�:�F�4�L��$�����/��"�3�'�'�
0��w�w��8�$��8�$��=�)��>�*��8�$��8�$�
��� *�%�$�%��$�#��0�
0��x�x��{�o�%=�e�W�E#�#)�*�.��!��o�4�/��
0�sG�B?�B0�B?�+C�0	B<�9B?�;B<�<B?�?C�	C<�#C7�7C<c�&�|j�}t|d�tz}t|d�tz}t|d�tz}t|d�tz}t|d�tz}tj|||||�S)Nrorqrsrtrz)r|r�r�r��	pcputimes)r9r�rorqrsrtrs       rAr�zProcess.cpu_times#s����&�&�(���f�W�o�&��4���f�W�o�&��4���v�&6�7�8�;�F���v�&6�7�8�;�F���v�m�,�-��;���}�}��5�.�.�&�
�	
r@c�:�t|j�d�S)zWhat CPU the process is on.rx�r�r|rds rArxzProcess.cpu_num/s���4�(�(�*�9�5�6�6r@Nc�B�tj|j|�SrL)r�wait_pidrF)r9�timeouts  rA�waitzProcess.wait4s��� � ����7�3�3r@c��|j�(t|j�d�tz|_|r|jS|jt	�zS)Nrv)r]r�r|r�rE)r9�	monotonics  rArvzProcess.create_time8sR���;�;���d�+�+�-�m�<�=��K�
�K���;�;���{�{�Y�[�(�(r@c	��t|j�d|j�d��5}d�|j�j	�ddD�\}}}}}}}ddd�tj�S#1swY�$xYw)Nrrz/statmc3�@K�|]}t|�tz���y�wrL)r�r�)�.0rIs  rA�	<genexpr>z&Process.memory_info.<locals>.<genexpr>Ws����8�+C�a��A���!�+C�s�rt)rr8rFr�rar��pmem)	r9r��vms�rssr��text�libr��dirtys	         rA�memory_infozProcess.memory_infoIs����D�-�-�.�a����z��@�
A�Q�8�+,�:�:�<�+=�+=�+?���+C�8�4�C��f�d�C��u�B��x�x��S�&�$��T�5�A�A�	B�
A�s�1A:�:Bc���dx}x}}t|j�d|j�d��5}|D]�}|jd�r#|t	|j�d�dzz
}�7|jd�r t	|j�d�dz}�h|jd�s�zt	|j�d�dz}��	ddd�|||fS#1swY�xYw)	Nrrrr1sPrivate_rr��Pss:�Swap:)rr8rFr�r�ra)r9�uss�pss�swapr�r�s      rA�_parse_smaps_rollupzProcess._parse_smaps_rollup^s��� !� �C� �#����$�$�%�Q�t�x�x�j�
�>����D����{�3��s�4�:�:�<��?�3�d�:�:������1�!�$�*�*�,�q�/�2�T�9������2�"�4�:�:�<��?�3�d�:������d�#�#���s�A<C�)!C�C!s\nPrivate.*:\s+(\d+)s\nPss\:\s+(\d+)s\nSwap\:\s+(\d+)c�.�|j�}ttt|j	|���dz}ttt|j	|���dz}ttt|j	|���dz}|||fS)Nr�)r�r�r�r��findall)r9�_private_re�_pss_re�_swap_re�
smaps_datar�r�r�s        rA�_parse_smapszProcess._parse_smapsus���*�.�.�0�J��c�#�{�2�2�:�>�?�@�4�G�C��c�#�w���z�:�;�<�t�C�C��s�3�� 0� 0�� <�=�>��E�D���d�#�#r@c��tr	|j�\}}}n|j	�\}}}|j�}t
j||||fz�S#ttf$r|j	�\}}}Y�MwxYwrL)�HAS_PROC_SMAPS_ROLLUPr�rBrAr�r�r��pfullmem)r9r�r�r��	basic_mems     rA�memory_full_infozProcess.memory_full_info�s���$�9�%)�%=�%=�%?�N�C��d�"&�!2�!2�!4���S�$��(�(�*�I��<�<��c�3��-=�!=�>�>��+�,=�>�9�%)�%6�%6�%8�N�C��d�9�s�A�#A?�>A?c�`�d�}|j�}|s|j�gS|jd�}g}|jd�}|g}|||�D�]5\}}|jdd�}	|\}	}
}}}
}|sd}n<t|�}|j
�}|jd�rt|�s|dd	}t|	�t|
�||jd
d�|jdd�|jdd�|jd
d�|jdd�|jdd�|jdd�|jdd�|jdd�|jdd�f
}|j|���8|S#t$r|dgz\}	}
}}}
}Y��1wxYw)a�Return process's mapped memory regions as a list of named
            tuples. Fields are explained in 'man proc'; here is an updated
            (Apr 2012) version: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/filesystems/proc.txt?id=b76437579d1344b612cf1851ae610c636cec7db0.

            /proc/{PID}/smaps does not exist on kernels < 2.6.14 or if
            CONFIG_MMU kernel configuration option is not enabled.
            c3�K�i}|D]f}|jdd�}|djd�s&|j�|f��|j|��O	t	|d�dz||d<�h|j�|f��y#t
tf$r(|djd�rY��d|��}t|�d�wxYw�w)N�rrrr�sVmFlags:z!don't know how to interpret line )rarb�popr�r�r�r{r�)r��
current_blockr�r�r�r�s      rA�
get_blocksz'Process.memory_maps.<locals>.get_blocks�s�������!�D�!�Z�Z��a�0�F�!�!�9�-�-�d�3�,�0�0�2�D�9�9�%�,�,�T�2�<�.1�&��)�n�t�.C�D����O�"�%�(�(�*�D�1�1��
!+�J�7�<�%�a�y�3�3�K�@� (�$E�d�X�"N�C�",�S�/�t�;�<�s*�AB?�B�.B?�#B<�(B?�*B<�<B?�
rNr�ruz[anon]r[r\sRss:sSize:r�s
Shared_Clean:s
Shared_Dirty:sPrivate_Clean:sPrivate_Dirty:sReferenced:s
Anonymous:r�)r�rSrar�r�rr�rbrr�r�)r9r�r�r�r��
first_liner��header�hfieldsr]�perms�_offset�_dev�_inodercr?s                rA�memory_mapszProcess.memory_maps�s���
2�&�(�(�*�D���%�%�'��	��J�J�u�%�E��B����1��J�'�L�M� *�5�-� @���� �,�,�t�Q�/��N�?F�<�D�%��$����#�D�!�$�<�D��:�:�<�D��}�}�\�2�;M��<� $�D�S�z���4�L��5�M���H�H�W�a�(��H�H�X�q�)��H�H�W�a�(��H�H�-�q�1��H�H�-�q�1��H�H�.��2��H�H�.��2��H�H�^�Q�/��H�H�]�A�.��H�H�X�q�)����	�	�$��=!A�>�I��7"�N�?F�"��~�<�D�%��$���N�s�2	F�F-�,F-c�\�|j|j�d|j�d�d��S)Nrrz/cwdrurr�rds rA�cwdzProcess.cwd�r�r@sctxt_switches:\t(\d+)c���|j�}|j|�}|s(d|j�d|j�d�}t	|��tjt|d�t|d��S)NzR'voluntary_ctxt_switches' and 'nonvoluntary_ctxt_switches'lines were not found in rrz1/status; the kernel is probably older than 2.6.23rr)rr�r8rFrr��pctxswr�)r9�	_ctxsw_rer��ctxswr�s     rA�num_ctx_switcheszProcess.num_ctx_switches�s}���%�%�'���!�!�$�'�����%�%�&�a����z�2.�.�
�&�c�*�*��z�z�#�e�A�h�-��U�1�X��7�7r@sThreads:\t(\d+)c�\�|j�}t|j|�d�S�Nr)rr�r�)r9�_num_threads_rer�s   rA�num_threadszProcess.num_threadss-���%�%�'���?�*�*�4�0��3�4�4r@c��tj|j�d|j�d��}|j	�g}d}|D]�}|j�d|j�d|�d�}	t|�5}|j
�j�}ddd�|jd�dzd}|jd	�}t|d
�tz}	t|d�tz}
tjt!|�|	|
�}|j#|���|r|j%�|S#1swY��xYw#ttf$rd}Y��wxYw)Nrrz/taskFz/task/rzTrKr:r�rnrp)r_r@r8rFrrr�r�rArBr�rar�r�r��pthreadr�r�rf)r9�
thread_idsr��
hit_enoent�	thread_idr�r��str�rorqr�s            rA�threadszProcess.threadss=���Z�Z�4�#4�#4�"5�Q�t�x�x�j�� F�G�
��������
�#�I��(�(�)��4�8�8�*�F�9�+�U�K�E�
� ��'�1�������)�B�(��B�G�G�D�M�A�%�'�(�B��X�X�d�^�F��&��*�%��3�E��&��*�%��3�E��[�[��Y����>�F��N�N�6�"�!$�"��$�$�&���!(�'��%�'9�:�
�"�
��	
�s*�)E�4D4�E�4D=	�9E�E�Ec�@�tj|j�SrL)r��proc_priority_getrFrds rA�nice_getzProcess.nice_get"s���%�%�d�h�h�/�/r@c�B�tj|j|�SrL)r��proc_priority_setrF)r9r�s  rA�nice_setzProcess.nice_set+s���%�%�d�h�h��6�6r@c�@�tj|j�SrL)r�r3rFrds rA�cpu_affinity_getzProcess.cpu_affinity_get2s���-�-�d�h�h�7�7r@sCpus_allowed_list:\t(\d+)-(\d+)c	��|j�}|j|�}|r6ttt	|dd�t	|dd�dz��Stttt
����S)Nrr)rr�r?�ranger�r�r�)r9�_rer�r�s    rA�_get_eligible_cpuszProcess._get_eligible_cpus6sk���)�)�+�D��K�K��%�E���E�#�e�A�h�q�k�"2�C��a����4D�q�4H�I�J�J��E�#�m�o�"6�7�8�8r@c	��	tj|j|�y#ttf$r�}t|t�s|jtjk(rl|j�}tttt����}|D]2}||vrd|�d|��}t	|�d�||vs� d|�d|��}t	|�|��d}~wwxYw)Nzinvalid CPU z; choose between zCPU number z! is not eligible; choose between )
r��proc_cpu_affinity_setrFr�r�r]rCrDr��tupler�r�r�)r9r�r��
eligible_cpus�all_cpus�cpur�s       rA�cpu_affinity_setzProcess.cpu_affinity_setAs���
��*�*�4�8�8�T�:���Z�(�
��c�:�.�#�)�)�u�|�|�2K�$(�$;�$;�$=�M�$�U�3�}��+?�%@�A�H�#���h�.�".�s�g�6$�$1�#4�!6� �#-�S�/�t�;��m�3�"-�c�U�3,�,9�?�!<� �#-�S�/�s�:� $���#
�s� #�C�BC�6C�Cc��tj|j�\}}t|�}t	j
||�SrL)r�r2rFr9r��pionice)r9�ioclassr�s   rA�
ionice_getzProcess.ionice_get[s5��!�1�1�$�(�(�;�N�G�U� ��)�G��;�;�w��.�.r@c���|�d}|r2|tjtjhvr|�d�}t|��|dks|dkDr
d}t|��t	j
|j||�S)Nrz ioclass accepts no valuertzvalue not in 0-7 range)r9r#r r�r��proc_ioprio_setrF)r9r�r�r�s    rA�
ionice_setzProcess.ionice_setas{���}������,�,��,�,�%��!��#<�=�� ��o�%��q�y�E�A�I�.�� ��o�%��'�'����'�5�A�Ar@�prlimitc�~�|jdk(r
d}t|��	|� tj|j|�St	|�dk7rd|��}t|��tj|j||�y#t
$r3}|jtjk(r|j��d}~wwxYw)Nrz)can't use prlimit() against PID 0 processr:z2second argument must be a (soft, hard) tuple, got )	rFr��resourcer�r�r�rC�ENOSYSrS)r9�	resource_�limitsr�r�s     rA�rlimitzProcess.rlimitrs���
�x�x�1�}�A�� ��o�%�
��>�#�+�+�D�H�H�i�@�@��6�{�a�'�*�*0��5��)��o�-��$�$�T�X�X�y�&�A���
��9�9����,��)�)�+���
�s�!B�?B�	B<�	.B7�7B<c�t�|j�d}|j�}tj|d�S)Nrq�?)r|r�
PROC_STATUSESr�)r9�letters  rArqzProcess.status�s3���&�&�(��2�������� � ���-�-r@c��g}tj|j�d|j�d��}d}|D�]}|j�d|j�d|��}	t	|�}|jd�s�@t
|�s�L|j�d|j�d|��}	t|�5}t|j�j�d�}t|j�j�dd�}	ddd�t	�}
tj|t|�t�|
|	�}|j|���|r|j-�|S#1swY�gxYw#tt f$rd}Y��RwxYw#tt f$rd}Y��jt"$rW}|j$t$j&k(rYd}~���|j$t$j(k(rt+|�Yd}~��Âd}~wwxYw)	Nrrr<Fr=z/fdinfo/rr�T)r_r@r8rFr`r�rrr�r�rarpr��	popenfiler�rArBr�rCrDrErrf)
r9r�r�r�rHrkrcr��posrmror�r�s
             rA�
open_fileszProcess.open_files�s������
�
�d�/�/�0��$�(�(��3�?�@���
��B��'�'�(��$�(�(��4��t�<�D�$
/���~��&�?�?�3�'�M�$�,?�"�/�/�0��$�(�(��8�B�4�H�D�
/�(��.�!�"%�a�j�j�l�&8�&8�&:�1�&=�">�C�$'��
�
��(:�(:�(<�Q�(?��$C�E�/� 2�%�8��!$��� �#�b�'�3�s�8�T�5�"�� ���v�.�M�N��$�$�&���/�.��.�/A�B�*�&*�
�*��3&�'9�:�
�!�
���
��9�9����,���9�9�� 2� 2�2��#�J����
�sU�F�!E4�,AE(�E4�(E1	�-E4�4F	�F	�G?� G?�(G:�(G:�9G:�:G?c�f�tj||j�}|j�|SrL)r�r�rFrf)r9r}rs   rAr�zProcess.net_connections�s)���'�'��d�h�h�7��� � �"��
r@c�r�ttj|j�d|j�d���S)Nrrr<)r�r_r@r8rFrds rA�num_fdszProcess.num_fds�s.���2�:�:��!2�!2� 3�1�T�X�X�J�c�B�C�D�Dr@c�:�t|j�d�S)NrNr�rds rArNzProcess.ppid�s���4�(�(�*�6�2�3�3r@sUid:\t(\d+)\t(\d+)\t(\d+)c��|j�}|j|�d\}}}tjt	|�t	|�t	|��Sr�)rr�r��puidsr�)r9�_uids_rer��real�	effective�saveds      rA�uidszProcess.uids��K���%�%�'��!)�!1�!1�$�!7��!:���i���y�y��T��C�	�N�C��J�?�?r@sGid:\t(\d+)\t(\d+)\t(\d+)c��|j�}|j|�d\}}}tjt	|�t	|�t	|��Sr�)rr�r��pgidsr�)r9�_gids_rer�rrrs      rA�gidszProcess.gids�rr@rL�F�r.)@r<r=r>r�r�r:rbrSrfrirjrYrr|rr�r�r�rvr�r�r�r�r_rcrg�getpidr�r�rxr�rvr�r��HAS_PROC_SMAPSr�r�r�r�r�r�r�r�r�r�r�r��HAS_CPU_AFFINITYr�r�r��HAS_PROC_IO_PRIORITYr�r��hasattrrrrqrr�rrNrrr?r@rAr[r[Ks���'��I�.�"� B�3�(-�� ��#���#�J��������$���$�3�
5�
�7��7��
��
�
����2�)��)�
����
�w�w�~�~��y�r�y�y�{�m�3�/�0�	� 	0�
� 	0�D�	
��	
��7��7��4��4��)��)� �B��B�$��	$�.
�#��
�
�#;�<��B�J�J�2�3��R�Z�Z� 4�5�	$�
�	$�8
�		?�
�		?�'���	�E	�
�E	�N�
��
�
�"��
�
�#<�=�
8��
8��*4�"�*�*�5H�*I�5��5�
����4�0��0��7��7��	�	8�
�	8�!�b�j�j�!D�E�		9�
�	�
�	�.�	�	/�
�	/�

�	B�
�	B��x��#�	�	�
�	�6�.��.��-��-�^����
�E��E��4��4��&�B�J�J�'D�E�@��@�
�&�B�J�J�'D�E�@��@r@r[rr)�r�rXr
�enumrCrWr�r_r�rr1rZ�sysr�rrrurrr�rr	r�r
rrr
rrrrrrrrrrrrrrrrr�__extra__all__r,rcrgrr r�r#r"r!r�r��getpagesizer��	byteorderrVr+rir��IntEnumr��	AF_PACKETr6r7r9�globalsrN�__members__�STATUS_RUNNING�STATUS_SLEEPING�STATUS_DISK_SLEEP�STATUS_STOPPED�STATUS_TRACING_STOP�
STATUS_ZOMBIE�STATUS_DEAD�STATUS_WAKE_KILL�
STATUS_WAKING�STATUS_IDLE�
STATUS_PARKEDrr$r%r&r'r(r)r*r+r,r-r.rir`rprxr�r��	Exceptionr�r�r�r�r��	heap_trimr�r�r�r�rrr�net_if_addrsr"r$r�r�r�r��
disk_usager�r�r�rrr:r<rErMrHrOrYr[r?r@rA�<module>r<s��
%�
������	�	��
�
�
��#�"����#��$�$�'�!�"�"�����$�"��+� ��(�'�"�"�	��$.�������&������
�V� <�=��������	��	�	��}�M�'J�K���t�%6�7���4�!8�9���b�j�j��&���4������
�
��)�
�����������i��V�%5�%5�!6�7��
��
�
��������	����'�'�(�
�	�	�	�	 �	 �	�	"�	"�	�	�	�	�	$�	$�	�	�	�	�	�	�	�	�	�	�	!�	!�	�	�	�	�	�	�	�	�	�
�
�"�
"�
"�
�
�
�
�
�
�
�
 �
 �
�
 �
 �
�
 �
 �
�
�
�
�
!�
!�
�
�
�
�
�
�
�
�
���(�(
�$�&	�+�	�+�0O�%�g�.�C�M�
�M�M�	�<�~~�B4<�p�4������I����I�"��&�:'�TN�.
��7�7�>�>�;�<������*�A�#�NL�� � ��	�I�	�i�i�X"�#��+�
,�^�B�
 �
 �
�f�RH�H�V$�Xs�l�>W:�~� � =�!�B�,�6R
@�R
@��O+�O�	�*�3�'�
2�3�?�J�{�,>�?��S�#�N�C�M�M��O�s�
P�P<�!P7�7P<
Back to Directory File Manager