HOME


sh-3ll 1.0
DIR:/usr/local/lib64/python3.6/site-packages/psutil/__pycache__/
Upload File :
Current File : //usr/local/lib64/python3.6/site-packages/psutil/__pycache__/_pslinux.cpython-36.pyc
3

�[gZ�@sJdZddlmZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlmZddlmZddlmZddlmZdd	lmZdd
lmZddlmZddlmZdd
lmZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm!Z!ddlm"Z"ddlm#Z#ddlm$Z$ddlm%Z%ddlm&Z&ddlm'Z'ddlm(Z(ddlm)Z)ddlm*Z*ddl+m,Z,dd l+m-Z-dd!l+m.Z.dd"l+m/Z/dd#l+m0Z0dd$l+m1Z1e,�r�ddl2Z2ndZ2d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4gZ3d5Z4ej5j6d6ej7��Z8ej5j6d7ej7��Z9e:ed8�Z;e:ed9�Z<ej=d:�Z>ej?�Z@daAejBd;kZCd<ZDe2dk�r�e
jEZFne2jGd=d>eHe
jE�i�ZIeIjFZFe2dk�r�dZJdZKd?ZLd@ZMn GdAdB�dBe2jG�ZNeO�jPeNjQ�ejRejSejTejUejVejWejXejXejYejZej[ej\dC�Z]ej^ej_ej`ejaejbejcejdejeejfejgejhdD�ZiedEdFdGdHdIdJdKdLdMdNdOdPg�ZjedQdRdSdTdUdVdWdXdYdZg	�Zked[d\d]d^d_d`g�Zledadb�Zmedcemjnd��Zoedgd\dhdidedjdkdldmdndodfg�Zpedpdqdrjqepjn��ZredsdRdSdTdUdtdug�Zsedvdwdxdydzd{g�Ztd|d}�Zud~d�Zvd�d��Zwe#d�d���Zxyexd��WnBeyk
�r�Zzz$ed�ez�ed�d��d�d�d��a{WYddZz[zXnXdZ|ydd�l}m|Z|WnBe~k
�r�ddlZej�dd�d��Z�e:e�d���r�d�d�d��Z|YnXe|dk	�re3j�d�d��e�e�D��d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�ej5j6d���srej5j6d���r|d�d��Z�nd�d��Z�ej�Z�Gd�d��d�ey�Z�Gd�d��d��Z�e��Z�d�d�d��Z�d�d��Z�d�d��Z�ej�Z�d�d�d��Z�Gd�d��d��Z�d�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d„Z�d�dĄZ�d�dƄZ�d�dȄZ�d�dʄZ�Gd�d̄d̃Z�dS)�zLinux platform implementation.�)�divisionN)�defaultdict)�
namedtuple�)�_common)�_psposix)�
_psutil_linux)�
_psutil_posix)�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)�PY3)�FileNotFoundError)�PermissionError)�ProcessLookupError)�b)�
basestring�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_supplyz/proc/%s/smapsz/proc/%s/smaps_rollup�proc_ioprio_get�proc_cpu_affinity_get�
SC_CLK_TCK�littlei�
AddressFamily�AF_LINK��c@seZdZdZdZdZdZdS)�
IOPriorityrrr:r;N)�__name__�
__module__�__qualname__r%r&r'r(�r@r@�;/usr/local/lib64/python3.6/site-packages/psutil/_pslinux.pyr<ysr<)�R�S�D�T�t�Z�X�x�K�W�I�P)Z01Z02Z03Z04Z05Z06Z07Z08Z09Z0AZ0B�svmem�total�	available�percent�used�free�active�inactive�buffers�cached�shared�slab�sdiskio�
read_count�write_count�
read_bytes�write_bytes�	read_time�
write_timeZread_merged_countZwrite_merged_count�	busy_time�	popenfile�path�fd�position�mode�flags�pmemz"rss vms shared text lib data dirty�pfullmem�uss�pss�swap�
pmmap_grouped�rss�sizeZshared_cleanZshared_dirtyZ
private_cleanZ
private_dirtyZ
referencedZ	anonymous�	pmmap_extzaddr perms � �pioZ
read_charsZwrite_chars�	pcputimes�user�system�
children_user�children_system�iowaitcCsNt|t�st|��tj|�}|jd�d}|jd�rJt|�rJ|dd�}|S)zWrapper around os.readlink().�rz
 (deleted)N�
i����)�
isinstancer#�AssertionError�os�readlink�split�endswithr)rcr@r@rAr~�s
r~cCsXtjdtjdtjdi}||tjtjBtjB@}|tj@rH|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)rgZ	modes_maprfr@r@rA�file_flags_to_mode�s
r�cCs4|jdd�}d}|rd|}nd|}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/%sz/sys/block/%s/device)r�r}�access�F_OK)�nameZincluding_virtualrcr@r@rA�is_storage_device�s

r�cCs�td|��}|j�j�dd�}WdQRXdddddd	d
g}t|�}|dkrX|jd�|d
krj|jd�|dkr||jd�td|�adS)z�Set 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.
    z%s/statrNrt�niceru�idlerxZirqZsoftirq�Zsteal�	ZguestrzZ
guest_nice�	scputimes)r�readliner�len�appendrr�)�procfs_path�f�values�fieldsZvlenr@r@rA�set_scputimes_ntuples	


r�z/procz ignoring exception on import: %rr�zuser system idleg)�prlimitT)�	use_errnor�cCs�Gdd�dtj�}|�}|dkr8tj||dtj|��}n6|�}|d|_|d|_tj||tj|�tj|��}|dkr�tj�}t|t	j
|���|j|jfS)Nc@s eZdZdejfdejfgZdS)zprlimit.<locals>.StructRlimit�rlim_cur�rlim_maxN)r=r>r?�ctypes�
c_longlong�_fields_r@r@r@rA�StructRlimit>sr�rr)r��	Structure�libcr��byrefr�r��	get_errno�OSErrorr}�strerror)�pid�	resource_�limitsr��current�ret�newZerrno_r@r@rAr�=s

cCs"g|]}|jd�r|j�r|�qS)ZRLIM)�
startswith�isupper)�.0rIr@r@rA�
<listcomp>Ysr�c"Cs(|d}||jdd�}y|d}|d}|d}Wn2tk
rf}ztd|jd�|Sd}~XnXytd	t��}Wntk
r�|SXd}|�:x2|D]*}	|	j�}	|	jd
�r�|t	|	j
�d�7}q�WWdQRX|t9}||}
||}|t|d|�8}|
|7}
|
|t|d
|�7}
t	|
�S)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
    sMemFree:sCached:rs
Active(file):sInactive(file):s
SReclaimable:zY%s is missing from /proc/meminfo; using an approximation for calculating available memoryNz%s/zoneinfoslowrr:g@)
�get�KeyErrorr�argsrr�IOError�stripr��intr�PAGESIZE�min)�memsrS�fallbackZlru_active_fileZlru_inactive_fileZslab_reclaimable�errr�Z
watermark_low�line�availZ	pagecacher@r@rA�calculate_avail_vmembs8

"r�cWCs�g}i}tdt���4}x,|D]$}|j�}t|d�d||d<qWWdQRX|d}|d}y|d}Wn"tk
r�d}|jd	�YnXy|d
}Wn"tk
r�d}|jd�YnX||jdd�7}y|d
}	WnHtk
�r$y|d}	Wn$tk
�rd}	|jd�YnXYnXy|d}
Wn$tk
�rVd}
|jd�YnXy|d}WnXtk
�r�y|d|d|d}Wn$tk
�r�d}|jd�YnXYnXy|d}Wntk
�r�d}YnX||||}
|
dk�r||}
y|d}Wntk
�r2t|�}YnX|dk�rFt|�}|dk�r`d}|jd�n||k�rn|}t|||dd�}|�r�ddj	|�t
|�dk�r�dndf}tj|t
dd �t||||
||
||||	|�S)!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.
    z
%s/meminforirNs	MemTotal:sMemFree:sBuffers:rVsCached:rWs
SReclaimable:sShmem:s
MemShared:rXsActive:rTs	Inactive:sInact_dirty:sInact_clean:sInact_laundry:rUsSlab:s
MemAvailable:rP)�round_z6%s memory stats couldn't be determined and %s set to 0z, �was�werer:)�
stacklevel)rrrr�r�r�r�r�r�joinr��warnings�warn�RuntimeWarningrN)Zmissing_fieldsr�r�r�r�rOrSrVrWrXrTrUrYrRr�rQ�msgr@r@rA�virtual_memory�s�
&

	


r�c%Cs�i}tdt���4}x,|D]$}|j�}t|d�d||d<qWWdQRXy|d}|d}Wn:tk
r�tj�\}}}}}}}||9}||9}YnX||}t||dd�}	ytd	t��}WnLtk
�r}
z.d
dt	|
�}t
j|tdd
�d}}
WYdd}
~
Xn�X|��d}}
x�|D]j}|j
d��rRt|jd�d�dd}n&|j
d��rxt|jd�d�dd}
|dk	�r&|
dk	�r&P�q&Wd
}|d7}t
j|tdd
�d}}
WdQRXtj||||	||
�S)zReturn swap memory metrics.z
%s/meminforirNs
SwapTotal:s	SwapFree:)r�z	%s/vmstatz,'sin' and 'sout' swap memory stats couldn't z$be determined and were set to 0 (%s)r:)r�spswpin� �spswpoutzbe determined and were set to 0)rrrr�r��cextZ
linux_sysinforr��strr�r�r�r�r�sswap)r�r�r�r�rOrS�_Zunit_multiplierrRrQr�r��sin�soutr@r@rA�swap_memory'sF
&
r�cCs^t�}t|�td|��}|j�j�}WdQRX|dttj�d�}dd�|D�}t|�S)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.
    z%s/statNrcSsg|]}t|�t�qSr@)�float�CLOCK_TICKS)r�rIr@r@rAr�oszcpu_times.<locals>.<listcomp>)rr�rr�rr�r��_fields)r�r�r�r�r@r@rA�	cpu_timescsr�cCs�t�}t|�g}td|��d}|j�xT|D]L}|jd�r.|j�}|dttj�d�}dd�|D�}t|�}|j	|�q.W|SQRXdS)zfReturn a list of namedtuple representing the CPU times
    for every CPU available on the system.
    z%s/statscpurcSsg|]}t|�t�qSr@)r�r�)r�rIr@r@rAr��sz!per_cpu_times.<locals>.<listcomp>N)
rr�rr�r�rr�r�r�r�)r��cpusr�r�r�r��entryr@r@rA�
per_cpu_timesss

r�cCs�y
tjd�Stk
r�d}tdt���*}x"|D]}|j�jd�r4|d7}q4WWdQRX|dkr�tjd�}t	dt���4}x,|D]$}|j
d	�d}|j|�r�|d7}q�WWdQRX|dkr�dS|SXdS)
z0Return the number of logical CPUs in the system.�SC_NPROCESSORS_ONLNrz
%s/cpuinfos	processorrNzcpu\dz%s/statrq)r}�sysconf�
ValueErrorrr�lowerr��re�compilerr�match)�numr�r��searchr@r@rA�cpu_count_logical�s$




r�cCst�}d}d}xBtj|�p"tj|�D]*}t|��}|j|j�j��WdQRXq$Wt|�}|dkrf|Si}i}tdt���z}xr|D]j}|j�j�}|s�y|d||d<Wnt	k
r�YnXi}q�|j
d
�r�|jdd	�\}	}
t|
�||	<q�WWdQRXt
|j��}|�pdS)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_listNrz
%s/cpuinfo�	cpu cores�physical ids	:r)r�r�)�set�globr�add�readr�r�rr�r�r�rr��sumr�)�ls�p1�p2rcr��result�mappingZcurrent_infor��key�valuer@r@rA�cpu_count_cores�s4
 

r�cCs�tdt����}d}d}d}xx|D]p}|jd�rBt|j�d�}n6|jd�r^t|j�d�}n|jd�rxt|j�d�}|dk	r"|dk	r"|dk	r"Pq"WWdQRXd}tj||||�S)z*Return various CPU stats as a named tuple.z%s/statNsctxtrsintrssoftirqr)rrr�r�rr�	scpustats)r��ctx_switches�
interrupts�soft_interruptsr��syscallsr@r@rA�	cpu_stats�s$



r�c
CsXg}tdt���<}x4|D],}|j�jd�r|jt|jdd�d��qWWdQRX|S)z7Return current CPU frequency from cpuinfo if available.z
%s/cpuinfoscpu mhz�:rN)rrr�r�r�r�r)r�r�r�r@r@rA�_cpu_get_cpuinfo_freq�s
(r�z'/sys/devices/system/cpu/cpufreq/policy0z$/sys/devices/system/cpu/cpu0/cpufreqcCs*t�}tjd�ptjd�}|jdd�d�g}tjj}x�t|�D]�\}}t|�t|�krf||d}nt||d�dd	�}|dkr�t||d
�dd	�}|dkr�dj	|�}t
|dd	�dkr�|jtj
d
d
d
��q@d}t|��t|�d}tt||d���d}	tt||d���d}
|jtj
||
|	��q@W|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]*/cpufreqcSsttjd|�j��S)Nz[0-9]+)r�r�r��group)rIr@r@rA�<lambda>�szcpu_freq.<locals>.<lambda>)r�i�Zscaling_cur_freqN)r�Zcpuinfo_cur_freqz$/sys/devices/system/cpu/cpu{}/onlinez0
gz!can't find current frequency fileZscaling_max_freqZscaling_min_freq)r�r��sortr}rcr��	enumerater�r�formatrr�r�scpufreq�NotImplementedErrorr�)Z
cpuinfo_freqs�pathsr�Zpjoin�irc�currZonline_pathr�Zmax_Zmin_r@r@rA�cpu_freq�s2

rcCsdd�t�D�S)z}Alternate implementation using /proc/cpuinfo.
        min and max frequencies are not available and are set to None.
        cSsg|]}tj|dd��qS)g)rr)r�rIr@r@rAr�#szcpu_freq.<locals>.<listcomp>)r�r@r@r@rArsc@seZdZdS)�_Ipv6UnsupportedErrorN)r=r>r?r@r@r@rAr	.sr	c@sZeZdZdZdd�Zdd�Zdd�Zedd	��Zeddd��Z	edd
d��Z
ddd�Zd
S)�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Cs�dtjtjf}dtjtjf}dtjtjf}dtjtjf}dtjdf}|||||f||f|f|f||f|f|f|f||||f||f||fd�|_d|_dS)N�tcp�tcp6�udp�udp6�unix)�allr�tcp4rr
�udp4rr�inet�inet4�inet6)�socket�AF_INET�SOCK_STREAM�AF_INET6�
SOCK_DGRAM�AF_UNIX�tmap�_procfs_path)�selfrrrrrr@r@rA�__init__>s"
zNetConnections.__init__cCs�tt�}x�tjd|j|f�D]�}ytd|j||f�}Wn`ttfk
rTwYqtk
r�}z,|j	t	j
krrw|j	t	jkr�t|�w�WYdd}~XqX|j
d�r|dd�dd�}||j|t|�f�qW|S)Nz%s/%s/fdz%s/%s/fd/%szsocket:[r�r���)r�listr}�listdirrr~rr!r��errno�EINVAL�ENAMETOOLONGrr�r�r�)rr��inodesrd�inoder�r@r@rA�get_proc_inodesUs"
zNetConnections.get_proc_inodescCsJi}x@t�D]6}y|j|j|��Wqtttfk
r@wYqXqW|S)N)�pids�updater(rr!r )rr&r�r@r@rA�get_all_inodesoszNetConnections.get_all_inodesc
Cs�|jd�\}}t|d�}|s fStr.|jd�}|tjkrntrZtj|tj	|�ddd��}q�tj|tj	|��}nxtj	|�}yJtr�tjtj
tjd	tj
d|����}n tjtj
tjd
tj
d|����}Wn"tk
r�t�s�t�n�YnXtj||�S)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
        �:��asciiNr�>4I�<4Ir )r/)r0)rr�r�encoderr�
LITTLE_ENDIAN�	inet_ntop�base64�	b16decoder�struct�pack�unpackr�rr	r�addr)r9�family�ip�portr@r@rA�decode_addresss0



zNetConnections.decode_addressNccsB|jd�rtjj|�rdSt|���}|j��xt|d�D]�\}}y(|j�dd�\
}}	}
}}}}}}}Wn&tk
r�t	d|||f��YnX||kr�||d\}
}nd\}
}|dk	r�||
kr�q>q>|t
jkr�t|}nt
j}ytj|	|�}	tj|
|�}
Wntk
�rw>YnX||||	|
||
fVq>WWdQRXdS)	z.Parse /proc/net/tcp* and /proc/net/udp* files.�6Nrrzz,error while parsing %s; malformed line %s %rrr )Nr )r�r}rc�existsrr�rrr��RuntimeErrorrr�TCP_STATUSESr�	CONN_NONEr
r=r	)�filer:�type_r&�
filter_pidr��linenor�r��laddr�raddr�statusr'r�rdr@r@rA�process_inet�s2(

zNetConnections.process_inetccst|���}|j�x�|D]�}|j�}y|dd�\}}}}}}}	Wn.tk
rpd|kr\wtd||f��YnX|	|kr�||	}
nd
g}
xh|
D]`\}}|dk	r�||kr�q�q�t|�dkr�|dnd}
tjt|��}d}tj	}||||
|||fVq�WqWWdQRXdS)zParse /proc/net/unix files.r�rqz)error while parsing %s; malformed line %rNrr��r )Nr r )
rr�rr�r@r�r�socktype_to_enumr�rB)rCr:r&rEr�r��tokensr�rDr'�pairsr�rdrcrHrIr@r@rA�process_unix�s.


zNetConnections.process_unixc
Cs||jkr,td|djdd�|jD��f��t�|_|dk	rP|j|�}|sXgSn|j�}t�}x�|j|D]�\}}}d|j|f}|tj	tj
fkr�|j|||||d�}	n|j||||d�}	xT|	D]L\}
}}}}}
}|r�t
j|
|||||
�}nt
j|
|||||
|�}|j|�q�WqjWt|�S)Nz+invalid %r kind argument; choose between %sz, cSsg|]}t|��qSr@)�repr)r�rIr@r@rAr�sz+NetConnections.retrieve.<locals>.<listcomp>z	%s/net/%s)rE)rr�r�rrr(r+r�rrrrJrPr�pconn�sconnr�r!)r�kindr�r&r�Z
proto_namer:rDrcr�rdrGrHrIZ	bound_pidZconnr@r@rA�retrieves2

zNetConnections.retrieve)N)N)N)r=r>r?�__doc__rr(r+�staticmethodr=rJrPrUr@r@r@rAr
2s
5)#r
rcCs
tj|�S)z$Return system-wide open connections.)�_net_connectionsrU)rTr@r@rA�net_connections)srYcCs�tdt���}|j�}WdQRXi}x�|dd�D]�}|jd�}|dksVtt|���|d|�j�}||dd�j�j�}tt	|�\}}}	}
}}}
}}}}}}}}}|||||	||
|f||<q4W|S)zsReturn network I/O statistics for every network interface
    installed on the system as a dict of raw tuples.
    z
%s/net/devNr:r,rr)
rr�	readlines�rfindr|rQr�r�mapr�)r��lines�retdictr�Zcolonr�r��
bytes_recv�packets_recv�errin�dropinZ_fifoinZ_frameinZ
_compressedinZ_multicastin�
bytes_sent�packets_sent�errout�dropoutZ_fifooutZ_collisionsoutZ_carrieroutZ_compressedoutr@r@rA�net_io_counters.s$
*rgcCs�tjttjttjti}t�j�}i}x�|D]�}y&t	j
|�}t	j|�}tj|�\}}Wn:t
k
r�}z|jtjkrv�nt|�WYdd}~Xq*Xdj|�}	d|k}
tj|
|||||	�||<q*W|S)z)Get NIC stats (isup, duplex, speed, mtu).N�,�running)r�ZDUPLEX_FULLr
ZDUPLEX_HALFrZDUPLEX_UNKNOWNrrg�keys�
cext_posixZ
net_if_mtuZnet_if_flagsZnet_if_duplex_speedr�r#ZENODEVrr�r�	snicstats)Z
duplex_map�namesr�r��mturg�duplex�speedr�Zoutput_flags�isupr@r@rA�net_if_stats]s&





rrFcCs�dd�}dd�}tjjdt��r*|�}n"tjjd�r>|�}ntdt���i}x`|D]X}|\
}}}}	}
}}}
}}|r�t|�r�qV|	t9}	|
t9}
|||	|
|||
||f	||<qVW|S)zcReturn disk I/O statistics for every disk installed on the
    system as a dict of raw tuples.
    css6tdt���}|j�}WdQRX�x|D�]}|j�}t|�}|dkr�|d}t|d�}tt|dd��\
}}}	}
}}}
}}}n�|dks�|dkr�|d}tt|dd��\}}}}	}
}}}
}}}nN|dk�r|d}tt|dd��\}}}
}d	}	}
}}}ntd
|��|||
|||	|
|||f
Vq*WdS)Nz%s/diskstats�r;r:r���rKrz!not sure how to interpret line %r)rrrZrr�r�r\r�)r�r]r�r�Zflenr��reads�reads_merged�rbytes�rtime�writes�
writes_merged�wbytes�wtimer�rar@r@rA�read_procfs�s&(*
z%disk_io_counters.<locals>.read_procfscss�x�tjd�D]�}x�tjtjjd|��D]�\}}}d|kr:q&ttjj|d���}|j�j�j�}WdQRXtjj	|�}t
t|dd��\
}}}	}
}}}
}}}||||	|
|
||||f
Vq&WqWdS)Nz
/sys/block�statrz)r}r"�walkrcr�rr�r�r�basenamer\r�)�block�rootr��filesr�r�r�rvrwrxryrzr{r|r}rar@r@rA�
read_sysfs�s &z$disk_io_counters.<locals>.read_sysfsz%s/diskstatsz
/sys/blockzC%s/diskstats nor /sys/block filesystem are available on this system)r}rcr?rrr��DISK_SECTOR_SIZE)Zperdiskr~r��genr^r�r�rvrzrxr|ryr}rwr{rar@r@rA�disk_io_counters�s&-

r�c@s@eZdZdZddgZdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dS)�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�minorcCs(tjd�j}tj|�|_tj|�|_dS)Nr�)r}r�st_devr�r�)r�devr@r@rAr�szRootFsDeviceFinder.__init__cCs�tdt����}x�|j�dd�D]z}|j�}t|�dkr<q"|dj�rTt|d�nd}|dj�rpt|d�nd}|d}||jkr"||jkr"|r"d|Sq"WWdQRXdS)Nz
%s/partitionsr:r�rrr;z/dev/%s)	rrrZrr��isdigitr�r�r�)rr�r�r�r�r�r�r@r@rA�ask_proc_partitions�sz&RootFsDeviceFinder.ask_proc_partitionsc
Cs^d|j|jf}t|��<}x4|D],}|jd�r |j�jd�d}|r d|Sq WWdQRXdS)Nz/sys/dev/block/%s:%s/ueventzDEVNAME=r:z/dev/%s)r�r�rr�r��
rpartition)rrcr�r�r�r@r@rA�ask_sys_dev_blocks


z$RootFsDeviceFinder.ask_sys_dev_blockcCs�d|j|jf}tjd�}xp|D]h}yt|�}Wntk
rFw Yq X|�6|j�j�}||kr~tj	j
tj	j|��}d|SWdQRXq WdS)Nz%s:%sz/sys/class/block/*/devz/dev/%s)r�r�r��iglobrrr�r�r}rcr��dirname)rZneedler�rCr��datar�r@r@rA�ask_sys_class_blocks

z&RootFsDeviceFinder.ask_sys_class_blockc,Cs�d}|dkrHy|j�}Wn.ttfk
rF}zt|�WYdd}~XnX|dkr�y|j�}Wn.ttfk
r�}zt|�WYdd}~XnX|dkr�y|j�}Wn.ttfk
r�}zt|�WYdd}~XnX|dk	r�tjj|�r�|SdS)N)	r�r�r�rr�r�r}rcr?)rrcr�r@r@rA�finds$zRootFsDeviceFinder.findN)
r=r>r?rV�	__slots__rr�r�r�r�r@r@r@rAr��s
	r�c
Cs*t�}t�}|sxtd|��V}xN|D]F}|j�}|jd�sJ|j|j��q$|jd�d}|dkr$|jd�q$WWdQRX|dkr�tjj	d�r�tjj
d�}ntjj
d	|�}g}tj|�}xl|D]d}	|	\}
}}}|
d
kr�d}
|
dkr�t
�j�p�|
}
|�s|
s�||k�rq�tj|
|||�}
|j|
�q�W|S)z8Return mounted disk partitions as a list of namedtuples.z%s/filesystemsZnodev�	rZzfsNz/procz	/etc/mtabz%s/self/mountsZnonerL�	/dev/root�rootfs)r�r�)r�rrr�r�r�rr}rc�isfile�realpathr��disk_partitionsr�r�r�	sdiskpartr�)rZfstypesr�r�r��fstypeZmounts_path�retlistZ
partitions�	partition�device�
mountpoint�opts�ntupler@r@rAr�5s8



r�c#Csptjt�}tjd�}|jtjd��ttdd�|D���}tjd�}tjd�}x*|D]"}|j	d|�}||krT|j
|�qTW�x |D�]}y>|d}tt|��d	}t
jjt
jj|�d
�}t|�j�}	Wntttfk
r�w�YnXt|ddd
�}
t|ddd
�}t|ddd
�j�}|
dk	�rNyt|
�d	}
Wntk
�rLd}
YnX|dk	�r�yt|�d	}Wntk
�r�d}YnX||	j
|||
|f�q�W|�shtjd�}tt|��}�x�|D�]�}y<t
jj|d�}tt|��d	}t
jj|d�}t|�j�}	Wn6tttfk
�r:}
zt|
��w�WYdd}
~
XnXtj|d�}tdd�|D��}d}d}
x�|D]�}t
jj||d�}t|dd
�j�}|dk�r�tt
jj||d�dd
�}n$|dk�r�tt
jj||d�dd
�}
|
dk	�ryt|
�d	}
Wntk
�rd}
YnX|dk	�rjyt|�d	}Wntk
�rDd}YnX�qjW||	j
d||
|f��q�Wt|�S)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*_*cSsg|]}|jd�d�qS)r�r)r)r�rIr@r@rAr�tsz(sensors_temperatures.<locals>.<listcomp>z5/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*z'/sys/devices/platform/coretemp.*/hwmon/z/sys/class/hwmon/�_inputg@�@r�Z_maxN)r�Z_crit�_labelrLz /sys/class/thermal/thermal_zone*�temp�typez/trip_point*cSs,g|]$}djtjj|�jd�dd���qS)r�rr;)r�r}rcr�r)r��pr@r@rAr��sZ_type�critical�_temp�high)�collectionsrr!r��extend�sortedr�r�r��subr�r�rr}rcr�r�rr�r�r�r�r�dict)r��	basenamesZ
basenames2�replr�Zaltname�basercr��	unit_namer�r��labelr�Z
trip_pathsZtrip_pointsZ
trip_pointZ	trip_typer@r@rA�sensors_temperaturesas�



	











r�cCs�tjt�}tjd�}|s"tjd�}ttdd�|D���}x�|D]�}ytt|d��}Wn0tt	fk
r�}zt
|�w>WYdd}~XnXttj
jtj
j|�d��j�}t|dd	d
�j�}||jtj||��q>Wt|�S)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*_*cSsg|]}|jd�d�qS)r�r)r)r�rIr@r@rAr��sz sensors_fans.<locals>.<listcomp>r�Nr�r�rL)r�)r�rr!r�r�r�r�rr�r�rrr}rcr�r�r�r�r�sfanr�)r�r�r�r�r�r�r�r@r@rA�sensors_fans�s




r�cs�t���fdd�}dd�tjt�D�}|s.dStjjtt|�d�}||d|d�}||d	|d
�}||d|d�}||d
�}|dk	r�|dk	r�yd||}Wq�tk
r�d}Yq�Xn tt	|ddd��}|dkr�dSd}|tjjtd�tjjtd��}	|	dk	�r|	dk}n6t	|ddd�j
�j�}
|
dk�r@d}n|
d k�rNd}|�r\tj
}nv|dk	�r�|dk	�r�yt||d�}Wntk
�r�tj}YnXn.|dk	�r�t|d�}|dk�r�tj}ntj}tj|||�S)!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sHxB|D]:}t|�d�}|�kryt|�Stk
r>|j�SXqWdS)zvAttempt to read the content of multiple files which may
        not exist. If none of them exist return None.
        )r�N)rr�r�r�)rrcr�)�nullr@rA�
multi_bcat�s
z#sensors_battery.<locals>.multi_bcatcSs&g|]}|jd�sd|j�kr|�qS)ZBATZbattery)r�r�)r�rIr@r@rAr�
sz#sensors_battery.<locals>.<listcomp>Nrz/energy_nowz/charge_nowz
/power_nowz/current_nowz/energy_fullz/charge_fullz/time_to_empty_nowgY@gz	/capacityr)r�z
AC0/onlinez	AC/onlinez/statusrLZdischargingF�charging�fullTi�<r r )r�r�)�objectr}r"�POWER_SUPPLY_PATHrcr�r��ZeroDivisionErrorr�rr�r�r�POWER_TIME_UNLIMITED�POWER_TIME_UNKNOWN�sbattery)r�Zbatsr�Z
energy_nowZ	power_nowZenergy_fullZ
time_to_emptyrQ�
power_pluggedZonlinerI�secsleftr@)r�rA�sensors_battery�sV





r�c	CsLg}tj�}x:|D]2}|\}}}}}tj||p0d|||�}|j|�qW|S)z:Return currently connected users as a list of namedtuples.N)r��usersr�suserr�)	r�Zrawlist�itemrt�tty�hostnameZtstampr��ntr@r@rAr�Us
r�cCsbdt�}t|��F}x2|D]*}|jd�rt|j�j�d�}|a|SqWtd|��WdQRXdS)zAReturn the system boot time expressed in seconds since the epoch.z%s/statsbtimerzline 'btime' not found in %sN)rrr�r�r�r�	BOOT_TIMEr@)rcr�r�r�r@r@rA�	boot_time`s



r�cCsdd�tjtt���D�S)z7Returns a list of PIDs currently running on the system.cSsg|]}|j�rt|��qSr@)r�r�)r�rIr@r@rAr�tszpids.<locals>.<listcomp>)r}r"r"rr@r@r@rAr)rsr)cCs�tj|�sdSybdt�|f}t|��B}x.|D]&}|jd�r.t|j�d�}||kSq.Wtd|��WdQRXWnttfk
r�|t	�kSXdS)zcCheck for the existence of a unix PID. Linux TIDs are not
    supported (always return False).
    Fz%s/%s/statussTgid:rz'Tgid' line not found in %sN)
r�
pid_existsrrr�r�rr��EnvironmentErrorr))r�rcr�r�Ztgidr@r@rAr�ws




r�cCs�i}t�}x�t�D]x}y(td||f��}|j�}WdQRXWnttfk
rVYqX|jd�}||dd�j�}t|d�}|||<qW|S)zsObtain a {pid: ppid, ...} dict for all running processes in
    one shot. Used to speed up Process.children().
    z
%s/%s/statN�)r:r)	rr)rr�rr!r[rr�)r�r�r�r�r��rparZdset�ppidr@r@rA�ppid_map�s
r�cstj���fdd��}|S)zlDecorator which translates bare OSError and IOError exceptions
    into NoSuchProcess and AccessDenied.
    cs�y�|f|�|�Stk
r2t|j|j��Ynltk
rZ|j�t|j|j��YnDtk
r�|j�tj	j
d|j|jf�s�t|j|j���YnXdS)Nz%s/%s)r r
r��_namer!�_raise_if_zombierrr}rcr?r)rr��kwargs)�funr@rA�wrapper�sz wrap_exceptions.<locals>.wrapper)�	functools�wraps)r�r�r@)r�rA�wrap_exceptions�sr�c@s�eZdZdZdddddgZdd�Zd	d
�Zdd�Zd
d�Ze	e
dd���Ze	e
dd���Ze	e
dd���Z
dd�Zdd�Ze	dd��Ze	dd��Ze	dd��Ze	dd ��Ze	d!d"��Zejjd#ej��r�e	d$d%��Ze	d&d'��Ze	d(d)��Ze	dhd+d,��Ze	d-d.��Ze	d/d0��Ze�s e �r\d1d2�Z!e	e"j#d3�e"j#d4�e"j#d5�fd6d7��Z$e	d8d9��Z%neZ%e �rre	d:d;��Z&e	d<d=��Z'e	e"j#d>�fd?d@��Z(e	e"j#dA�fdBdC��Z)e	dDdE��Z*e	dFdG��Z+e	dHdI��Z,e-�r�e	dJdK��Z.e"j#dL�fdMdN�Z/e	dOdP��Z0e1�re	dQdR��Z2e	dSdT��Z3e4d*k	�r4e	didUdV��Z5e	dWdX��Z6e	dYdZ��Z7e	djd\d]��Z8e	d^d_��Z9e	d`da��Z:e	e"j#db�fdcdd��Z;e	e"j#de�fdfdg��Z<d*S)k�ProcesszLinux process implementation.�_cacher��_ppidrr�cCs||_d|_d|_t�|_dS)N)r�r�r�rr)rr�r@r@rAr�szProcess.__init__cCs\ytd|j|jf�}Wnttfk
r0dSX|jd�}||d|d�}|dkSdS)Nz
%s/%s/statFr�r:r;�Z)rrr�r�r�r[)rr�r�rIr@r@rA�
_is_zombie�s
zProcess._is_zombiecCs|j�rt|j|j|j��dS)N)r�rr�r�r�)rr@r@rAr��szProcess._raise_if_zombiecCstjd|j|jf�dS)z+Raise NSP if the process disappeared on us.z%s/%sN)r}rrr�)rr@r@rA�_raise_if_not_alive�szProcess._raise_if_not_alivecCs�td|j|jf�}|jd�}||jd�d|�}||dd�j�}i}||d<|d|d	<|d|d
<|d|d<|d
|d<|d|d<|d|d<|d|d<|d|d<|d|d<y|d|d<Wn$tk
r�td�d|d<YnX|S)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.
        z
%s/%s/statr��(rr:Nr�rrIr�r��ttynr��utime��stime�
�children_utimert�children_stime��create_time�$�cpu_num�'�blkio_ticksz&can't get blkio_ticks, set iowait to 0)rrr�r[r�r�
IndexErrorr)rr�r�r�r�r�r@r@rA�_parse_stat_file�s*
zProcess._parse_stat_filec	Cs(td|j|jf��
}|j�SQRXdS)z�Read /proc/{pid}/stat file and return its content.
        The return value is cached in case oneshot() ctx manager is
        in use.
        z%s/%s/statusN)rrr�r�)rr�r@r@rA�_read_status_fileszProcess._read_status_filec	Cs,td|j|jf��}|j�j�SQRXdS)Nz%s/%s/smaps)rrr�r�r�)rr�r@r@rA�_read_smaps_fileszProcess._read_smaps_filecCs(|jj|�|jj|�|jj|�dS)N)r��cache_activater�r�)rr@r@rA�
oneshot_enter szProcess.oneshot_entercCs(|jj|�|jj|�|jj|�dS)N)r��cache_deactivater�r�)rr@r@rA�oneshot_exit%szProcess.oneshot_exitcCs|j�d}trt|�}|S)Nr�)r�rr)rr�r@r@rAr�*szProcess.namecCsXytd|j|jf�Sttfk
rR|j�tjjd|j|jf�rLdS�YnXdS)Nz	%s/%s/exez%s/%srL)	r~rr�rr!r�r}rc�lexists)rr@r@rA�exe2szProcess.exec
Cs�td|j|jf��}|j�}WdQRX|s8|j�gS|jd�rFdnd}|j|�r`|dd�}|j|�}|dkr�t|�dkr�d|kr�|jd�}|S)Nz
%s/%s/cmdlineryrqrr )rrr�r�r�r�rr�)rr�r��sep�cmdliner@r@rAr�?s


zProcess.cmdlinec	Cs0td|j|jf��}|j�}WdQRXt|�S)Nz
%s/%s/environ)rrr�r�r)rr�r�r@r@rA�environYszProcess.environcCs:t|j�d�}tj�}y||Stk
r4dSXdS)Nr�)r�r�rZget_terminal_mapr�)rZtty_nrrr@r@rA�terminal_szProcess.terminalz/proc/%s/iocCs�d|j|jf}i}t|��V}xN|D]F}|j�}|r$y|jd�\}}Wntk
r\w$Yq$Xt|�||<q$WWdQRX|s�td|��y*t|d|d|d|d|d|d	�St	k
r�}ztd
|j
d||f��WYdd}~XnXdS)Nz%s/%s/ios: z%s file was emptyssyscrssyscws
read_bytesswrite_bytessrcharswcharz1%r field was not found in %s; found fields are %rr)rr�rr�rr�r�r@rrr�r�)r�fnamer�r�r�r�r�r�r@r@rA�io_countersks2


zProcess.io_counterscCsh|j�}t|d�t}t|d�t}t|d�t}t|d�t}t|d�t}t|||||�S)Nr�r�r�r�r�)r�r�r�rs)rr�r�r�r�r�rxr@r@rAr��szProcess.cpu_timescCst|j�d�S)zWhat CPU the process is on.r�)r�r�)rr@r@rAr��szProcess.cpu_numNcCstj|j||j�S)N)rZwait_pidr�r�)r�timeoutr@r@rA�wait�szProcess.waitcCs&t|j�d�}tpt�}|t|S)Nr�)r�r�r�r�r�)r�ctimeZbtr@r@rAr��s
zProcess.create_timec	Cs`td|j|jf��2}dd�|j�j�dd�D�\}}}}}}}WdQRXt|||||||�S)Nz%s/%s/statmcss|]}t|�tVqdS)N)r�r�)r�rIr@r@rA�	<genexpr>�sz&Process.memory_info.<locals>.<genexpr>rK)rrr�r�rrh)	rr�ZvmsrnrX�text�libr�Zdirtyr@r@rA�memory_info�s
6zProcess.memory_infocCs�d}}}tdj|j|j���v}xn|D]f}|jd�rP|t|j�d�d7}q(|jd�rpt|j�d�d}q(|jd�r(t|j�d�d}q(WWdQRX|||fS)Nrz{}/{}/smaps_rollupsPrivate_risPss:sSwap:)rrrr�r�r�r)rrjrkrlr�r�r@r@rA�_parse_smaps_rollup�s	



"zProcess._parse_smaps_rollups\nPrivate.*:\s+(\d+)s\nPss\:\s+(\d+)s\nSwap\:\s+(\d+)cCsZ|j�}ttt|j|���d}ttt|j|���d}ttt|j|���d}|||fS)Ni)r�r�r\r��findall)rZ_private_reZ_pss_reZ_swap_reZ
smaps_datarjrkrlr@r@rA�_parse_smaps�s
zProcess._parse_smapsc
Cshtr@y|j�\}}}WqNttfk
r<|j�\}}}YqNXn|j�\}}}|j�}t||||f�S)N)�HAS_PROC_SMAPS_ROLLUPrr!rr
r
ri)rrjrkrlZ	basic_memr@r@rA�memory_full_info�szProcess.memory_full_infocCshdd�}|j�}|s |j�gS|jd�}g}|jd�}|g}�x"|||�D�]\}}|jdd�}y|\}	}
}}}
}Wn*tk
r�|dg\}	}
}}}
}YnX|s�d}n4tr�t|�}|j�}|jd	�r�t	|�r�|dd�}t|	�t|
�||j
dd�|j
dd�|j
d
d�|j
dd�|j
dd�|j
dd�|j
dd�|j
dd�|j
dd�|j
dd�f
}|j|�qLW|S)aQReturn process's mapped memory regions as a list of named
            tuples. Fields are explained in 'man proc'; here is an updated
            (Apr 2012) version: http://goo.gl/fmebo.

            /proc/{PID}/smaps does not exist on kernels < 2.6.14 or if
            CONFIG_MMU kernel configuration option is not enabled.
            css�i}x�|D]�}|jdd�}|djd�sB|j�|fV|j|�q
yt|d�d||d<Wq
tk
r�|djd�r�w
ntd|��Yq
Xq
W|j�|fVdS)N�rr�risVmFlags:z#don't know how to interpret line %r)rr��popr�r�r�r�)r]�
current_blockr�r�r�r@r@rA�
get_blockss
z'Process.memory_maps.<locals>.get_blocks�
rNrrLz[anon]z
 (deleted)rzsRss:sSize:sPss:s
Shared_Clean:s
Shared_Dirty:sPrivate_Clean:sPrivate_Dirty:sReferenced:s
Anonymous:sSwap:i����)r�r�rrr�rrr�r�rr�r�)rrr�r]r��
first_liner�headerZhfieldsr9Zperms�_offsetZ_devZ_inodercr�r@r@rA�memory_mapssL











zProcess.memory_mapscCstd|j|jf�S)Nz	%s/%s/cwd)r~rr�)rr@r@rA�cwdRszProcess.cwdsctxt_switches:\t(\d+)cCsL|j�}|j|�}|s,td|j|jf��ntjt|d�t|d��SdS)Nz�'voluntary_ctxt_switches' and 'nonvoluntary_ctxt_switches'lines were not found in %s/%s/status; the kernel is probably older than 2.6.23rr)r�rrrr�r�pctxswr�)rZ	_ctxsw_rer�Zctxswr@r@rA�num_ctx_switchesVs
zProcess.num_ctx_switchessThreads:\t(\d+)cCs|j�}t|j|�d�S)Nr)r�r�r)rZ_num_threads_rer�r@r@rA�num_threadseszProcess.num_threadscCs�tjd|j|jf�}|j�g}d}x�|D]�}d|j|j|f}y$t|��}|j�j�}WdQRXWntt	fk
r�d}w,YnX||j
d�dd�}|jd�}t|d�t
}	t|d	�t
}
tjt|�|	|
�}|j|�q,W|r�|j�|S)
Nz
%s/%s/taskFz%s/%s/task/%s/statTr�r:r�r�r�)r}r"rr�rrr�r�rr!r�rr�r�r�pthreadr�r�r�)rZ
thread_idsr��
hit_enoentZ	thread_idrr��str�r�r�r�r@r@rA�threadsms0


zProcess.threadscCstj|j�S)N)rk�getpriorityr�)rr@r@rA�nice_get�szProcess.nice_getcCstj|j|�S)N)rk�setpriorityr�)rr�r@r@rA�nice_set�szProcess.nice_setcCstj|j�S)N)r�r5r�)rr@r@rA�cpu_affinity_get�szProcess.cpu_affinity_getsCpus_allowed_list:\t(\d+)-(\d+)cCsV|j�}|j|�}|r@ttt|dd�t|dd�d��Stttt����SdS)Nrr)r�rr!�ranger�r�r�)r�_rer�r�r@r@rA�_get_eligible_cpus�s

*zProcess._get_eligible_cpuscCs�ytj|j|�Wn�ttfk
r�}zvt|t�s>|jtjkr�|j�}t	t
tt����}x<|D]4}||krztd||f��||kr^td||f��q^W�WYdd}~XnXdS)Nz(invalid CPU number %r; choose between %sz0CPU number %r is not eligible; choose between %s)
r�Zproc_cpu_affinity_setr�r�r�r{r#r$r(�tupler&r�r�)rr�r�Z
eligible_cpusZall_cpusZcpur@r@rA�cpu_affinity_set�s 
zProcess.cpu_affinity_setcCs,tj|j�\}}tdk	r t|�}tj||�S)N)r�r4r��enumr<r�pionice)r�ioclassr�r@r@rA�
ionice_get�szProcess.ionice_getcCsT|dkrd}|r(|ttfkr(td|��|dks8|dkrDd}t|��tj|j||�S)Nrz%r ioclass accepts no valuerKzvalue not in 0-7 range)r(r%r�r�Zproc_ioprio_setr�)rr-r�r�r@r@rA�
ionice_set�szProcess.ionice_setcCs�|jdkrd}t|��yJ|dkr,t|j|�St|�dkrPddt|�}t|��t|j||�Wn8tk
r�}z|jtjkr�|j��WYdd}~XnXdS)Nrz)can't use prlimit() against PID 0 processr:z'second argument must be a (soft, hard) z
tuple, got %s)	r�r�r�r�rQr�r#ZENOSYSr�)rr�r�r�r�r@r@rA�rlimit�s
zProcess.rlimitcCs$|j�d}tr|j�}tj|d�S)NrI�?)r�rr�
PROC_STATUSESr�)r�letterr@r@rArI�szProcess.statusc
Csvg}tjd|j|jf�}d}�xB|D�]8}d|j|j|f}yt|�}Wndttfk
rhd}w&Yq&tk
r�}z,|jtj	kr�w&|jtj
kr�t|�w&�WYdd}~Xq&X|jd�o�t
|�r&d|j|j|f}yBt|��0}t|j�j�d�}	t|j�j�dd�}
WdQRXWnttfk
�r4d}Yq&Xt|
�}t|t|�t|	�||
�}|j|�q&W|�rr|j�|S)	Nz%s/%s/fdFz%s/%s/fd/%sTr�z%s/%s/fdinfo/%srr�)r}r"rr�r~rr!r�r#r$r%rr�rrr�r�rr�rbr�r�)
rr�r�rrdrCrcr�r��posrgrfr�r@r@rA�
open_files�sF
$
zProcess.open_filesrcCstj||j�}|j�|S)N)rXrUr�r�)rrTr�r@r@rArY/	szProcess.net_connectionscCsttjd|j|jf��S)Nz%s/%s/fd)r�r}r"rr�)rr@r@rA�num_fds5	szProcess.num_fdscCst|j�d�S)Nr�)r�r�)rr@r@rAr�9	szProcess.ppidsUid:\t(\d+)\t(\d+)\t(\d+)cCs6|j�}|j|�d\}}}tjt|�t|�t|��S)Nr)r�rr�puidsr�)rZ_uids_rer��real�	effective�savedr@r@rA�uids=	szProcess.uidssGid:\t(\d+)\t(\d+)\t(\d+)cCs6|j�}|j|�d\}}}tjt|�t|�t|��S)Nr)r�rr�pgidsr�)rZ_gids_rer�r8r9r:r@r@rA�gidsC	szProcess.gids)N)N)r)=r=r>r?rVr�rr�r�r�r�rr�r�r�r�r�r�r�r�rrr}rcr?�getpidrr�r�rr�r
r�HAS_PROC_SMAPSrr�r�r
rrrrrr r"r$�HAS_CPU_AFFINITYr%r(r*�HAS_PROC_IO_PRIORITYr.r/r�r0rIr5rYr6r�r;r=r@r@r@rAr��s�&	

!

L
	

4r�)rjrkrl)N)r)F)F)�rV�
__future__rr4r�r#r�r�r}r�rr6�sysr�rrrLrrrr�r	rkr
rrr
rrrrrrrrrrrrrrrr�_compatrrr r!r"r#r+Z__extra__all__r�rcr?r>r?r�hasattrrAr@r�r�Zgetpagesizer�r��	byteorderr2r��	AF_PACKETr9�IntEnumr�r8r%r&r'r(r<�globalsr*�__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_PARKEDr2r)r*r+r,r-r.r/r0r1r2r3rArNrZrbrhr�rirmr�rprrrsr~r�r�r��	Exceptionr�r�r��resource�ImportErrorr��CDLLr�r��dirr�r�r�r�r�r�r�r�r�rZnet_if_addrsr	r
rXrYrgrr�
disk_usager�r�r�r�r�r�r�r�r)r�r�r�r�r@r@r@rA�<module>sf













	
$

	@<+

)u
/"
hK
,v_