B
    çÚ†\YI  ã            H   @   s:  d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ydd	lmZ W n ek
r¼   dZY nX ydd
lmZ W n ek
ræ   dZY nX e	jdkrüddlZndZe	jd dkZdddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTgHZejdUkZejdVkZe	j dW¡Ze	j dX¡ZeZ e	j dY¡Z!e	j dZ¡Z"e	j d[¡Z#e!pe"pe#Z$e	j d\¡Z%e	j d]¡Z&d^Z'd_Z(d`Z)daZ*dbZ+dcZ,ddZ-deZ.dfZ/dgZ0dhZ1diZ2djZ3dkZ4dlZ5dmZ6dnZ7doZ8dpZ9dqZ:drZ;dsZ<dtZ=duZ>dvZ?dwZ@edkrždxZAdyZBdZCn G dzd{„ d{ejDƒZEeFƒ  GeEjH¡ edkrÒd|ZId}ZJn G d~d„ dejDƒZKeFƒ  GeKjH¡ e	 L¡ ZMesd€ZNn2ye	 O¡ ZNW n$ ePk
r6   er.dnd€ZNY nX edHd‚dƒd„d…d†d‡gƒZQedDd‚dƒd„d…gƒZRedBdˆd‰dŠd‹dŒdgƒZSedCdŽddd‘gƒZTedEd’d“d”d•d–d—d˜d™gƒZUedIdšd›dœddžgƒZVed@dŸd d¡d¢d£d¤džgƒZWedFd d¥d¦d§d¨gƒZXedGd©dªd«d¬gƒZYedAd­d®d¯d°gƒZZed±d²d³d´gƒZ[edµd¶d²d·d¸gƒZ\ed¹d…dºd»gƒZ]ed¼d¶d²gƒZ^ed8d½d¾d¿dÀgƒZ_ed=dÁdŸgƒZ`ed>dÂdÃdÄgƒZaed?dÅdÆdÇgƒZbed:dÅdÆdÇgƒZced;dˆd‰dŠd‹gƒZded<dÈdÉgƒZeed9dÊdËgƒZfed7dŸd d¡d¢d£d¤gƒZgedÌdÍdÎgƒZheeegeegfeegegfegegfeegegfegegfeegeegfegeegfegeegfdÏœZiedk	rzei GegegfegegfdÐœ¡ edk	rœei GdÑegeegfi¡ [[[[dädÒdP„ZjdÓdM„ ZkdÔdÕ„ ZldÖdL„ Zmd×dO„ ZnekdØdQ„ ƒZodÙdN„ ZpdÚdR„ ZqdÛdS„ ZrdÜdK„ ZsG dÝdÞ„ dÞƒZtdßdT„ Zuetƒ Zvevjweu_wevjxeu_xdàdá„ Zydâdã„ ZzdS )åz9Common objects shared by __init__.py and _ps*.py modules.é    )ÚdivisionN)Údefaultdict)Ú
namedtuple)ÚAF_INET)Ú
SOCK_DGRAM)ÚSOCK_STREAM)ÚAF_INET6)ÚAF_UNIX)é   é   r
   ÚFREEBSDÚBSDÚLINUXÚNETBSDÚOPENBSDÚMACOSÚOSXÚPOSIXÚSUNOSÚWINDOWSÚENCODINGÚENCODING_ERRSr   Ú
CONN_CLOSEÚCONN_CLOSE_WAITÚCONN_CLOSINGÚCONN_ESTABLISHEDÚCONN_FIN_WAIT1ÚCONN_FIN_WAIT2ÚCONN_LAST_ACKÚCONN_LISTENÚ	CONN_NONEÚCONN_SYN_RECVÚCONN_SYN_SENTÚCONN_TIME_WAITÚNIC_DUPLEX_FULLÚNIC_DUPLEX_HALFÚNIC_DUPLEX_UNKNOWNÚSTATUS_DEADÚSTATUS_DISK_SLEEPÚSTATUS_IDLEÚSTATUS_LOCKEDÚSTATUS_RUNNINGÚSTATUS_SLEEPINGÚSTATUS_STOPPEDÚSTATUS_SUSPENDEDÚSTATUS_TRACING_STOPÚSTATUS_WAITINGÚSTATUS_WAKE_KILLÚSTATUS_WAKINGÚSTATUS_ZOMBIEÚSTATUS_PARKEDÚpconnÚ	pcputimesÚpctxswÚpgidsÚpioÚpioniceÚ	popenfileÚpthreadÚpuidsÚsconnÚ	scpustatsÚsdiskioÚ	sdiskpartÚ
sdiskusageÚsnetioÚsnicaddrÚ	snicstatsÚsswapÚsuserÚ	conn_tmapÚdeprecated_methodÚisfile_strictÚmemoizeÚparse_environ_blockÚpath_exists_strictÚusage_percentÚsupports_ipv6Úsockfam_to_enumÚsocktype_to_enumÚwrap_numbersÚposixÚntZlinuxÚdarwinZfreebsdZopenbsdZnetbsd)ZsunosZsolarisZaixZrunningZsleepingz
disk-sleepZstoppedztracing-stopZzombieZdeadz	wake-killZwakingZidleÚlockedZwaitingZ	suspendedZparkedZESTABLISHEDZSYN_SENTZSYN_RECVZ	FIN_WAIT1Z	FIN_WAIT2Z	TIME_WAITZCLOSEZ
CLOSE_WAITZLAST_ACKZLISTENZCLOSINGZNONEé   é   c               @   s   e Zd ZdZdZdZdS )Ú	NicDuplexrW   rX   r   N)Ú__name__Ú
__module__Ú__qualname__r$   r%   r&   © r]   r]   ú-lib/python3.7/site-packages/psutil/_common.pyrY      s   rY   éÿÿÿÿéþÿÿÿc               @   s   e Zd ZdZdZdS )ÚBatteryTimer_   r`   N)rZ   r[   r\   ÚPOWER_TIME_UNKNOWNÚPOWER_TIME_UNLIMITEDr]   r]   r]   r^   ra      s   ra   ÚreplaceÚsurrogateescapeÚtotalÚusedZfreeZpercentZsinZsoutZ
read_countZwrite_countZ
read_bytesZwrite_bytesZ	read_timeZ
write_timeZdeviceZ
mountpointZfstypeZoptsZ
bytes_sentZ
bytes_recvZpackets_sentZpackets_recvZerrinZerroutZdropinZdropoutÚnameZterminalZhostZstartedÚpidÚfdZfamilyÚtypeZladdrZraddrZstatusZaddressZnetmaskZ	broadcastZptpZisupZduplexZspeedZmtuZctx_switchesZ
interruptsZsoft_interruptsZsyscallsÚscpufreqZcurrentÚminÚmaxÚshwtempZlabelZhighZcriticalÚsbatteryZsecsleftZpower_pluggedÚsfanÚuserÚsystemÚchildren_userÚchildren_systemÚpathÚidZ	user_timeZsystem_timeÚrealZ	effectiveZsavedZioclassÚvalueZ	voluntaryZinvoluntaryÚaddrZipZport)ÚallZtcpZtcp4ZudpZudp4ZinetZinet4Zinet6)Ztcp6Zudp6Zunixc             C   s\   y| | d }W n0 t k
r@   t| tƒs4t|tƒr8dnd}Y nX |dk	rTt||ƒS |S dS )z5Calculate percentage usage of 'used' against 'total'.éd   g        r   N)ÚZeroDivisionErrorÚ
isinstanceÚfloatÚround)rg   rf   Zround_Úretr]   r]   r^   rN     s    "
c                s2   t  ˆ¡‡ ‡fdd„ƒ}‡ fdd„}i ‰ ||_|S )a  A simple memoize decorator for functions supporting (hashable)
    positional arguments.
    It also provides a cache_clear() function for clearing the cache:

    >>> @memoize
    ... def foo()
    ...     return 1
        ...
    >>> foo()
    1
    >>> foo.cache_clear()
    >>>
    c                 sH   | t t| ¡ ƒƒf}yˆ | S  tk
rB   ˆ| |Ž }ˆ |< |S X d S )N)Ú	frozensetÚsortedÚitemsÚKeyError)ÚargsÚkwargsÚkeyr   )ÚcacheÚfunr]   r^   Úwrapper%  s    zmemoize.<locals>.wrapperc                  s   ˆ   ¡  dS )zClear cache.N)Úclearr]   )r‰   r]   r^   Úcache_clear.  s    zmemoize.<locals>.cache_clear)Ú	functoolsÚwrapsr   )rŠ   r‹   r   r]   )r‰   rŠ   r^   rK     s
    	c                s6   t  ˆ ¡‡ fdd„ƒ}dd„ }dd„ }||_||_|S )aú  A memoize decorator which is disabled by default. It can be
    activated and deactivated on request.
    For efficiency reasons it can be used only against class methods
    accepting no arguments.

    >>> class Foo:
    ...     @memoize
    ...     def foo()
    ...         print(1)
    ...
    >>> f = Foo()
    >>> # deactivated (default)
    >>> foo()
    1
    >>> foo()
    1
    >>>
    >>> # activated
    >>> foo.cache_activate(self)
    >>> foo()
    1
    >>> foo()
    >>> foo()
    >>>
    c                sP   y| j ˆ  }W n< tk
r&   ˆ | ƒS  tk
rJ   ˆ | ƒ }| j ˆ < Y nX |S )N)Ú_cacheÚAttributeErrorr…   )Úselfr   )rŠ   r]   r^   r‹   Q  s    z'memoize_when_activated.<locals>.wrapperc             S   s
   i | _ dS )zjActivate cache. Expects a Process instance. Cache will be
        stored as a "_cache" instance attribute.N)r   )Úprocr]   r]   r^   Úcache_activate_  s    z.memoize_when_activated.<locals>.cache_activatec             S   s"   y| ` W n tk
r   Y nX dS )zDeactivate and clear cache.N)r   r‘   )r“   r]   r]   r^   Úcache_deactivated  s    z0memoize_when_activated.<locals>.cache_deactivate)rŽ   r   r”   r•   )rŠ   r‹   r”   r•   r]   )rŠ   r^   Úmemoize_when_activated7  s    r–   c          
   C   sV   yt  | ¡}W n6 tk
rD } z|jtjtjfkr4‚ dS d}~X Y nX t |j¡S dS )zœSame as os.path.isfile() but does not swallow EACCES / EPERM
    exceptions, see:
    http://mail.python.org/pipermail/python-dev/2012-June/120787.html
    FN)ÚosÚstatÚOSErrorÚerrnoÚEPERMÚEACCESÚS_ISREGÚst_mode)rv   ÚstÚerrr]   r]   r^   rJ   p  s    c          
   C   sN   yt  | ¡ W n6 tk
rD } z|jtjtjfkr4‚ dS d}~X Y nX dS dS )zœSame as os.path.exists() but does not swallow EACCES / EPERM
    exceptions, see:
    http://mail.python.org/pipermail/python-dev/2012-June/120787.html
    FNT)r—   r˜   r™   rš   r›   rœ   )rv   r    r]   r]   r^   rM     s    c           	   C   s`   t jrtdkrdS y2t   tt j¡} t | ¡ |  d¡ W dQ R X dS  t jk
rZ   dS X dS )z2Return True if IPv6 is supported on this platform.NF)z::1r   T)ÚsocketZhas_ipv6r   r   Ú
contextlibÚclosingZbindÚerror)Zsockr]   r]   r^   rO   Ž  s    c             C   sz   i }d}t }xh|  d|¡}||kr$P |  d||¡}||krj| ||… }| |d |… }|rb| ¡ }|||< |d }qW |S )zCParse a C environ block of environment variables into a dictionary.r   ú ú=rX   )r   ÚfindÚupper)Údatar   ÚposZWINDOWS_Znext_posZ	equal_posrˆ   ry   r]   r]   r^   rL   œ  s     c          	   C   s4   t dkr| S y
t | ¡S  ttfk
r.   | S X dS )zConvert a numeric socket family value to an IntEnum member.
    If it's not a known member, return the numeric value itself.
    N)Úenumr¡   ZAddressFamilyÚ
ValueErrorr‘   )Únumr]   r]   r^   rP   ¸  s    
c          	   C   s4   t dkr| S y
t | ¡S  ttfk
r.   | S X dS )zConvert a numeric socket type value to an IntEnum member.
    If it's not a known member, return the numeric value itself.
    N)r«   r¡   ZAddressTyper¬   r‘   )r­   r]   r]   r^   rQ   Å  s    
c                s   ‡ fdd„}|S )zƒA decorator which can be used to mark a method as deprecated
    'replcement' is the method name which will be called instead.
    c                s:   d| j ˆf ‰ | jd krˆ | _t | ¡‡ ‡fdd„ƒ}|S )Nz8%s() is deprecated and will be removed; use %s() insteadc                s    t jˆ tdd t| ˆƒ||ŽS )NrW   )ÚcategoryÚ
stacklevel)ÚwarningsÚwarnÚDeprecationWarningÚgetattr)r’   r†   r‡   )ÚmsgÚreplacementr]   r^   ÚinnerÜ  s    z/deprecated_method.<locals>.outer.<locals>.inner)rZ   Ú__doc__rŽ   r   )rŠ   r¶   )rµ   )r´   r^   ÚouterÖ  s    
z deprecated_method.<locals>.outerr]   )rµ   r¸   r]   )rµ   r^   rI   Ò  s    c               @   sB   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zddd„Zdd„ Z	d
S )Ú_WrapNumberszNWatches numbers so that they don't overflow and wrap
    (reset to zero).
    c             C   s    t  ¡ | _i | _i | _i | _d S )N)Ú	threadingZLockÚlockr‰   Ú	remindersÚreminder_keys)r’   r]   r]   r^   Ú__init__é  s    
z_WrapNumbers.__init__c             C   sT   || j kst‚|| jkst‚|| jks*t‚|| j |< ttƒ| j|< ttƒ| j|< d S )N)r‰   ÚAssertionErrorr¼   r½   r   ÚintÚset)r’   Ú
input_dictrh   r]   r]   r^   Ú	_add_dictï  s    
z_WrapNumbers._add_dictc             C   sd   | j | }t| ¡ ƒt| ¡ ƒ }x<|D ]4}x"| j| | D ]}| j| |= q<W | j| |= q(W dS )z†In case the number of keys changed between calls (e.g. a
        disk disappears) this removes the entry from self.reminders.
        N)r‰   rÁ   Úkeysr½   r¼   )r’   rÂ   rh   Úold_dictZ	gone_keysZgone_keyÚremkeyr]   r]   r^   Ú_remove_dead_reminders÷  s    

z#_WrapNumbers._remove_dead_remindersc          	   C   s  || j kr|  ||¡ |S |  ||¡ | j | }i }xÌ| ¡ D ]À}|| }y|| }W n tk
rt   |||< w>Y nX g }xvtt|ƒƒD ]f}	||	 }
||	 }||	f}|
|k rÖ| j| |  |7  < | j| |  	|¡ | 
|
| j| |  ¡ qˆW t|ƒ||< q>W || j |< |S )zkCache dict and sum numbers which overflow and wrap.
        Return an updated copy of `input_dict`
        )r‰   rÃ   rÇ   rÄ   r…   ÚrangeÚlenr¼   r½   ÚaddÚappendÚtuple)r’   rÂ   rh   rÅ   Znew_dictrˆ   Zinput_tupleZ	old_tupleÚbitsÚiZinput_valueÚ	old_valuerÆ   r]   r]   r^   Úrun  s2    


z_WrapNumbers.runNc          	   C   sh   | j X |dkr0| j ¡  | j ¡  | j ¡  n*| j |d¡ | j |d¡ | j |d¡ W dQ R X dS )z>Clear the internal cache, optionally only for function 'name'.N)r»   r‰   rŒ   r¼   r½   Úpop)r’   rh   r]   r]   r^   r   )  s    

z_WrapNumbers.cache_clearc          	   C   s"   | j  | j| j| jfS Q R X dS )z5Return internal cache dicts as a tuple of 3 elements.N)r»   r‰   r¼   r½   )r’   r]   r]   r^   Ú
cache_info5  s    z_WrapNumbers.cache_info)N)
rZ   r[   r\   r·   r¾   rÃ   rÇ   rÐ   r   rÒ   r]   r]   r]   r^   r¹   ä  s   '
r¹   c          	   C   s   t j t  | |¡S Q R X dS )zÅGiven an `input_dict` and a function `name`, adjust the numbers
    which "wrap" (restart from zero) across different calls by adding
    "old value" to "new value" and return an updated dict.
    N)Ú_wnr»   rÐ   )rÂ   rh   r]   r]   r^   rR   ;  s    c             K   s   t | df|ŽS )NÚrb)Úopen)Úfnamer‡   r]   r]   r^   Úopen_binaryI  s    r×   c             K   s*   t r| dt¡ | dt¡ t| df|ŽS )z¨On Python 3 opens a file in text mode by using fs encoding and
    a proper en/decoding errors handler.
    On Python 2 this is just an alias for open(name, 'rt').
    ÚencodingÚerrorsZrt)ÚPY3Ú
setdefaultr   r   rÕ   )rÖ   r‡   r]   r]   r^   Ú	open_textM  s    rÜ   )N){r·   Z
__future__r   r¢   rš   rŽ   r—   r¡   r˜   Úsysrº   r°   Úcollectionsr   r   r   r   r   r   ÚImportErrorr	   Úversion_infor«   rÚ   Ú__all__rh   r   r   ÚplatformÚ
startswithr   r   r   r   r   r   r   r   ZAIXr+   r,   r(   r-   r/   r3   r'   r1   r2   r)   r*   r0   r.   r4   r   r"   r!   r   r   r#   r   r   r   r   r   r    r$   r%   r&   ÚIntEnumrY   ÚglobalsÚupdateÚ__members__rb   rc   ra   Úgetfilesystemencodingr   r   Úgetfilesystemencodeerrorsr‘   rF   rB   r@   rA   rC   rG   r>   rD   rE   r?   rl   ro   rp   rq   r6   r;   r<   r=   r8   r9   r:   r7   r5   rz   rH   rN   rK   r–   rJ   rM   rO   rL   rP   rQ   rI   r¹   rR   rÓ   r   rÒ   r×   rÜ   r]   r]   r]   r^   Ú<module>   sR  



	

	






	





 9W	