???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................3
JZ=C                 @   s  d 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 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 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 ddlmZ ddlmZ g ZejdZejZej e
j!ej"e
j#ej$e
j%ej&e
j'ej(e
j)ej*e
j+ej,e
j-ej.e
j/ej0e
j1ej2e
j3ej4e
j5ej6e
j7iZ8ej9e
j:ej;e
j<ej=e
j>ej?e
j@ejAe
jBiZCeDddddddddddddZEeDddddddddd ZFed!d"d#d$d%gZGed&d'd(d)d*d+d,d-d.gZHed/d0d1d2d3gZIed4eIjJda ZKed6d7ZLed8d9d:jMeLjJ ZNd;d< ZOd=d> ZPd?d@ ZQdAdB ZRdCdD ZSdEdF ZTdGdH ZUdIdJ ZVejWZWejXZXdbdLdMZYdNdO ZZej[Z[ej\Z\dcdQdRZ]dSdT Z^dUdV Z_dWdX Z`dYdZ ZaejbZbd[d\ Zcejdd]d^ ZeG d_d` d`efZgdS )dzOSX platform implementation.    N)AF_INET)
namedtuple   )_common)_psposix)_psutil_osx)_psutil_posix)AF_INET6)	conn_tmap)isfile_strict)memoize_when_activated)parse_environ_block)sockfam_to_enum)socktype_to_enum)usage_percent)AccessDenied)NoSuchProcess)ZombieProcessSC_PAGE_SIZE                     	   
   )ppidruideuidsuidrgidegidsgidttynrctimestatusname)cpuutimecpustimerssvmspfaultspageins
numthreadsvolctxsw	scputimesusernicesystemidlesvmemtotalZ	availablepercentusedfreeactiveinactivewiredpmemr+   r,   r-   r.   pfullmemusspmmap_groupedz7path rss private swapped dirtied ref_count shadow_depth	pmmap_extzaddr perms  c           	   C   sN   t j \} }}}}|| }|| | }t| | | dd}t| |||||||S )z&System virtual memory as a namedtuple.r   )_round)cextZvirtual_memr   r6   )r7   r;   r<   r=   r:   Zavailr9   r8    rF   /usr/lib64/python3.6/_psosx.pyvirtual_memoryx   s    rH   c              C   s4   t j \} }}}}t|| dd}tj| |||||S )z=Swap system memory as a (total, used, free, sin, sout) tuple.r   )rD   )rE   Zswap_memr   r   Zsswap)r7   r9   r:   ZsinZsoutr8   rF   rF   rG   swap_memory   s    rI   c              C   s   t j \} }}}t| |||S )z(Return system CPU times as a namedtuple.)rE   	cpu_timesr1   )r2   r3   r4   r5   rF   rF   rG   rJ      s    rJ   c              C   s>   g } x4t j D ](}|\}}}}t||||}| j| qW | S )z(Return system CPU times as a named tuple)rE   per_cpu_timesr1   append)retZcpu_tr2   r3   r4   r5   itemrF   rF   rG   rK      s    rK   c               C   s   t j S )z0Return the number of logical CPUs in the system.)rE   cpu_count_logicalrF   rF   rF   rG   rO      s    rO   c               C   s   t j S )z1Return the number of physical CPUs in the system.)rE   Zcpu_count_physrF   rF   rF   rG   cpu_count_physical   s    rP   c              C   s"   t j \} }}}}tj| |||S )N)rE   	cpu_statsr   Z	scpustats)Zctx_switchesZ
interruptsZsoft_interruptsZsyscallsZtrapsrF   rF   rG   rQ      s    rQ   c              C   s   t j \} }}tj| ||gS )zReturn CPU frequency.
    On OSX per-cpu frequency is not supported.
    Also, the returned frequency never changes, see:
    https://arstechnica.com/civis/viewtopic.php?f=19&t=465002
    )rE   cpu_freqr   Zscpufreq)ZcurrZmin_Zmax_rF   rF   rG   rR      s    rR   Fc       	      C   sr   g }t j }x`|D ]X}|\}}}}|dkr.d}| sPtjj| stjj| rPqtj||||}|j| qW |S )z8Return mounted disk partitions as a list of namedtuples.Znone )	rE   disk_partitionsospathisabsexistsr   Z	sdiskpartrL   )	allretlistZ
partitions	partitionZdeviceZ
mountpointZfstypeZoptsntuplerF   rF   rG   rT      s    
rT   c              C   sb   yt j \} }}W n tk
r&   dS X |dk}|r<tj}n|dkrLtj}n|d }tj| ||S )z Return battery information.
    Nr   <   )rE   sensors_batteryNotImplementedErrorr   ZPOWER_TIME_UNLIMITEDZPOWER_TIME_UNKNOWNZsbattery)r8   ZminsleftZpower_pluggedZsecsleftrF   rF   rG   r_      s    r_   inetc             C   sr   g }xht  D ]^}yt|j| }W n tk
r8   wY qX |rx*|D ]"}t||g }|jtj|  qDW qW |S )z System-wide network connections.)pidsProcessconnectionsr   listrL   r   Zsconn)kindrM   pidZconscrF   rF   rG   net_connections   s    
ri   c              C   sj   t  j } i }xV| D ]N}tj|}tj|}tj|\}}ttdrNtj|}tj	||||||< qW |S )z)Get NIC stats (isup, duplex, speed, mtu).	NicDuplex)
net_io_counterskeys
cext_posixZ
net_if_mtuZnet_if_flagsZnet_if_duplex_speedhasattrr   rj   Z	snicstats)namesrM   r(   ZmtuZisupZduplexZspeedrF   rF   rG   net_if_stats  s    





rp   c               C   s   t j S )z:The system boot time expressed in seconds since the epoch.)rE   	boot_timerF   rF   rF   rG   rq     s    rq   c        	      C   s`   g } t j }xN|D ]F}|\}}}}}|dkr.q|s4qtj||p@d|pFd||}| j| qW | S )z:Return currently connected users as a list of namedtuples.~N)rE   usersr   ZsuserrL   )	rZ   rawlistrN   r2   ZttyZhostnameZtstamprg   ntrF   rF   rG   rs     s    
rs   c              C   s`   t j } d| kr\ytdj  | jd W n0 tk
r>   Y n tk
rZ   | jd Y nX | S )Nr   )rE   rb   rc   create_timerL   r   r   )ZlsrF   rF   rG   rb   0  s    rb   c                s   t j  fdd}|S )z`Decorator which translates bare OSError exceptions into
    NoSuchProcess and AccessDenied.
    c                st   y | f||S  t k
rn } zB|jtjkr<t| j| j|jtjtjfkr\t| j| j W Y d d }~X nX d S )N)	OSErrorerrnoESRCHr   rg   _nameZEPERMZEACCESr   )selfargskwargserr)funrF   rG   wrapperG  s    z wrap_exceptions.<locals>.wrapper)	functoolswraps)r   r   rF   )r   rG   wrap_exceptionsC  s    
r   c             c   s   y
dV  W n t tfk
r } zrt|ts6|jtjkry| j }W n tk
rZ   |Y qX |tjkrzt	| j
| j| jqt| j
| jn W Y dd}~X nX dS )zThere are some poor C APIs which incorrectly raise ESRCH when
    the process is still alive or it's a zombie, or even RuntimeError
    (those who don't set errno). This is here in order to solve:
    https://github.com/giampaolo/psutil/issues/1044
    N)rw   RuntimeError
isinstancerx   ry   r'   r   r   STATUS_ZOMBIEr   rg   rz   _ppidr   )procr~   r'   rF   rF   rG   catch_zombieT  s    


r   c               @   sn  e Zd ZdZdddgZdd Zedd Zed	d
 Zdd Z	dd Z
edd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zedd  Zed!d" Zed#d$ Zed%d& Zed'd( Zed)d* Zed+d, Zed-d. ZedAd0d1Zed2d3 ZedBd5d6Zed7d8 Zed9d: Z ed;d< Z!ed=d> Z"ed?d@ Z#d4S )Crc   z1Wrapper class around underlying C implementation.rg   rz   r   c             C   s   || _ d | _d | _d S )N)rg   rz   r   )r{   rg   rF   rF   rG   __init__s  s    zProcess.__init__c             C   s$   t j| j}t|ttks t|S )N)rE   Zproc_kinfo_oneshotrg   lenkinfo_proc_mapAssertionError)r{   rM   rF   rF   rG   _get_kinfo_procx  s    zProcess._get_kinfo_procc          
   C   s8   t |  tj| j}W d Q R X t|ttks4t|S )N)r   rE   Zproc_pidtaskinfo_oneshotrg   r   pidtaskinfo_mapr   )r{   rM   rF   rF   rG   _get_pidtaskinfo  s    
zProcess._get_pidtaskinfoc             C   s   | j j  | jj  d S )N)r   Zcache_activater   )r{   rF   rF   rG   oneshot_enter  s    
zProcess.oneshot_enterc             C   s   | j j  | jj  d S )N)r   Zcache_deactivater   )r{   rF   rF   rG   oneshot_exit  s    
zProcess.oneshot_exitc             C   s(   | j  td  }|d k	r|S tj| jS )Nr(   )r   r   rE   Z	proc_namerg   )r{   r(   rF   rF   rG   r(     s    zProcess.namec          	   C   s    t |  tj| jS Q R X d S )N)r   rE   Zproc_exerg   )r{   rF   rF   rG   exe  s    
zProcess.exec          	   C   s    t |  tj| jS Q R X d S )N)r   rE   Zproc_cmdlinerg   )r{   rF   rF   rG   cmdline  s    
zProcess.cmdlinec          
   C   s$   t |  ttj| jS Q R X d S )N)r   r   rE   Zproc_environrg   )r{   rF   rF   rG   environ  s    
zProcess.environc             C   s   | j  td  | _| jS )Nr   )r   r   r   )r{   rF   rF   rG   r     s    zProcess.ppidc          	   C   s    t |  tj| jS Q R X d S )N)r   rE   Zproc_cwdrg   )r{   rF   rF   rG   cwd  s    
zProcess.cwdc             C   s.   | j  }tj|td  |td  |td  S )Nr   r    r!   )r   r   puidsr   )r{   rawtuplerF   rF   rG   uids  s
    

zProcess.uidsc             C   s.   | j  }tj|td  |td  |td  S )Nr"   r#   r$   )r   r   r   r   )r{   r   rF   rF   rG   gids  s
    

zProcess.gidsc             C   s:   | j  td  }tj }y|| S  tk
r4   d S X d S )Nr%   )r   r   r   Zget_terminal_mapKeyError)r{   Ztty_nrZtmaprF   rF   rG   terminal  s    zProcess.terminalc             C   s6   | j  }t|td  |td  |td  |td  S )Nr+   r,   r-   r.   )r   r>   r   )r{   r   rF   rF   rG   memory_info  s    


zProcess.memory_infoc             C   s"   | j  }tj| j}t||f  S )N)r   rE   Zproc_memory_ussrg   r?   )r{   Z	basic_memr@   rF   rF   rG   memory_full_info  s    zProcess.memory_full_infoc             C   s(   | j  }tj|td  |td  ddS )Nr)   r*   g        )r   r   Z	pcputimesr   )r{   r   rF   rF   rG   rJ     s
    

zProcess.cpu_timesc             C   s   | j  td  S )Nr&   )r   r   )r{   rF   rF   rG   rv     s    zProcess.create_timec             C   s   | j  td  }tj|dS )Nr0   r   )r   r   r   Zpctxsw)r{   ZvolrF   rF   rG   num_ctx_switches  s    zProcess.num_ctx_switchesc             C   s   | j  td  S )Nr/   )r   r   )r{   rF   rF   rG   num_threads  s    zProcess.num_threadsc             C   sf   | j dkrg S g }t|  tj| j }W d Q R X x.|D ]&\}}t|r8tj||}|j| q8W |S )Nr   )rg   r   rE   Zproc_open_filesr   r   Z	popenfilerL   )r{   filesrt   rV   fdr\   rF   rF   rG   
open_files  s    

zProcess.open_filesra   c             C   s   |t kr(td|djdd t D f t | \}}t|  tj| j||}W d Q R X g }xz|D ]r}|\}}}	}
}}t| }t|}t	|	}	|t
tfkr|
rtj|
 }
|rtj| }tj|||	|
||}|j| qbW |S )Nz+invalid %r kind argument; choose between %sz, c             S   s   g | ]}t |qS rF   )repr).0xrF   rF   rG   
<listcomp>   s    z'Process.connections.<locals>.<listcomp>)r
   
ValueErrorjoinr   rE   Zproc_connectionsrg   TCP_STATUSESr   r   r   r	   r   ZaddrZpconnrL   )r{   rf   Zfamiliestypesrt   rM   rN   r   ZfamtypeZladdrZraddrr'   ru   rF   rF   rG   rd     s(    



zProcess.connectionsc          	   C   s.   | j dkrdS t|  tj| j S Q R X d S )Nr   )rg   r   rE   Zproc_num_fds)r{   rF   rF   rG   num_fds  s    

zProcess.num_fdsNc             C   s   t j| j|| jS )N)r   Zwait_pidrg   rz   )r{   ZtimeoutrF   rF   rG   wait  s    zProcess.waitc          	   C   s    t |  tj| jS Q R X d S )N)r   rm   getpriorityrg   )r{   rF   rF   rG   nice_get  s    
zProcess.nice_getc          
   C   s"   t |  tj| j|S Q R X d S )N)r   rm   setpriorityrg   )r{   valuerF   rF   rG   nice_set#  s    
zProcess.nice_setc             C   s   | j  td  }tj|dS )Nr'   ?)r   r   PROC_STATUSESget)r{   coderF   rF   rG   r'   (  s    zProcess.statusc             C   sT   t |  tj| j}W d Q R X g }x*|D ]"\}}}tj|||}|j| q*W |S )N)r   rE   Zproc_threadsrg   r   ZpthreadrL   )r{   rt   rZ   Z	thread_idutimeZstimer\   rF   rF   rG   threads.  s    
zProcess.threadsc          	   C   s    t |  tj| jS Q R X d S )N)r   rE   Zproc_memory_mapsrg   )r{   rF   rF   rG   memory_maps8  s    
zProcess.memory_maps)ra   )N)$__name__
__module____qualname____doc__	__slots__r   r   r   r   r   r   r   r(   r   r   r   r   r   r   r   r   r   r   rJ   rv   r   r   r   rd   r   r   r   r   r'   r   r   rF   rF   rF   rG   rc   n  sB   
	
	
rc   )r@   )F)ra   )hr   
contextlibrx   r   rU   Zsocketr   collectionsr   rS   r   r   r   rE   r   rm   r	   r
   r   r   r   r   r   r   _exceptionsr   r   r   Z__extra__all__sysconfZPAGESIZEZAF_LINKZTCPS_ESTABLISHEDZCONN_ESTABLISHEDZTCPS_SYN_SENTZCONN_SYN_SENTZTCPS_SYN_RECEIVEDZCONN_SYN_RECVZTCPS_FIN_WAIT_1ZCONN_FIN_WAIT1ZTCPS_FIN_WAIT_2ZCONN_FIN_WAIT2ZTCPS_TIME_WAITZCONN_TIME_WAITZTCPS_CLOSEDZ
CONN_CLOSEZTCPS_CLOSE_WAITZCONN_CLOSE_WAITZTCPS_LAST_ACKZCONN_LAST_ACKZTCPS_LISTENZCONN_LISTENZTCPS_CLOSINGZCONN_CLOSINGZPSUTIL_CONN_NONEZ	CONN_NONEr   ZSIDLZSTATUS_IDLEZSRUNZSTATUS_RUNNINGZSSLEEPZSTATUS_SLEEPINGZSSTOPZSTATUS_STOPPEDZSZOMBr   r   dictr   r   r1   r6   r>   _fieldsr?   rA   r   rB   rH   rI   rJ   rK   rO   rP   rQ   rR   Z
disk_usageZdisk_io_countersrT   r_   rk   Znet_if_addrsri   rp   rq   rs   rb   Z
pid_existsr   contextmanagerr   objectrc   rF   rF   rF   rG   <module>   s   





