B
    "„Oc“?  ã               @   sÀ  d 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 g Ze ¡ 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
j-ej.e
j/ej0e
j1ej2e
j3ej4iZ5e
j6ej7e
j8ej9e
j:ej;e
j<ej=e
j>ej?iZ@eAddddddddddddZBeAdddddddddZCedd d!d"d#gƒZDed$d%d&d'd(d)d*d+d,gƒZEed-d.d/d0d1gƒZFed2eFjGd3 ƒZHd4d5„ ZId6d7„ ZJd8d9„ ZKd:d;„ ZLd<d=„ ZMd>d?„ ZNd@dA„ ZOdBdC„ ZPejQZQe
jRZRdZdEdF„ZSdGdH„ ZTe
jUZUejVZVd[dJdK„ZWdLdM„ ZXdNdO„ ZYdPdQ„ ZZdRdS„ Z[ej\Z\dTdU„ Z]dVdW„ Z^G dXdY„ dYe_ƒZ`dS )\zmacOS platform implementation.é    N)Ú
namedtupleé   )Ú_common)Ú_psposix)Ú_psutil_osx)Ú_psutil_posix)ÚAccessDenied)ÚNoSuchProcess)ÚZombieProcess)Ú	conn_tmap)Úconn_to_ntuple)Úisfile_strict)Úmemoize_when_activated)Úparse_environ_block)Úusage_percent)ÚPermissionError)ÚProcessLookupErroré   é   é   é   é   é   é   é	   é
   )Ú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)Úussc        	   	   C   sT   t  ¡ \} }}}}}|| }|| }||8 }t| | | dd}t| |||||||ƒS )z&System virtual memory as a namedtuple.r   )Úround_)ÚcextZvirtual_memr   r4   )	r5   r9   r:   r;   r8   ZspeculativeZavailr7   r6   © rA   ú,lib/python3.7/site-packages/psutil/_psosx.pyÚvirtual_memoryo   s    rC   c              C   s4   t  ¡ \} }}}}t|| dd}t | |||||¡S )z=Swap system memory as a (total, used, free, sin, sout) tuple.r   )r?   )r@   Zswap_memr   r   Zsswap)r5   r7   r8   ZsinZsoutr6   rA   rA   rB   Úswap_memory€   s    rD   c              C   s   t  ¡ \} }}}t| |||ƒS )z(Return system CPU times as a namedtuple.)r@   Ú	cpu_timesr/   )r0   r1   r2   r3   rA   rA   rB   rE   Œ   s    rE   c              C   s>   g } x4t  ¡ D ](}|\}}}}t||||ƒ}|  |¡ qW | S )z(Return system CPU times as a named tuple)r@   Úper_cpu_timesr/   Úappend)ÚretZcpu_tr0   r1   r2   r3   ÚitemrA   rA   rB   rF   ’   s    rF   c               C   s   t  ¡ S )z0Return the number of logical CPUs in the system.)r@   Úcpu_count_logicalrA   rA   rA   rB   rJ   œ   s    rJ   c               C   s   t  ¡ S )z-Return the number of CPU cores in the system.)r@   Úcpu_count_coresrA   rA   rA   rB   rK   ¡   s    rK   c              C   s"   t  ¡ \} }}}}t | |||¡S )N)r@   Ú	cpu_statsr   Z	scpustats)Zctx_switchesZ
interruptsZsoft_interruptsZsyscallsZtrapsrA   rA   rB   rL   ¦   s    rL   c              C   s   t  ¡ \} }}t | ||¡gS )z¾Return CPU frequency.
    On macOS per-cpu frequency is not supported.
    Also, the returned frequency never changes, see:
    https://arstechnica.com/civis/viewtopic.php?f=19&t=465002
    )r@   Úcpu_freqr   Zscpufreq)ZcurrZmin_Zmax_rA   rA   rB   rM   ­   s    rM   Fc          	   C   sz   g }t  ¡ }xh|D ]`}|\}}}}|dkr.d}| sLtj |¡rtj |¡sLqd }}	t ||||||	¡}
| |
¡ qW |S )z8Return mounted disk partitions as a list of namedtuples.ZnoneÚ N)	r@   Údisk_partitionsÚosÚpathÚisabsÚexistsr   Z	sdiskpartrG   )ÚallÚretlistZ
partitionsÚ	partitionZdeviceZ
mountpointZfstypeZoptsZmaxfileZmaxpathÚntuplerA   rA   rB   rO   À   s    
rO   c              C   sb   yt  ¡ \} }}W n tk
r&   dS X |dk}|r<tj}n|dkrLtj}n|d }t | ||¡S )zReturn battery information.Nr   éÿÿÿÿé<   )r@   Úsensors_batteryÚNotImplementedErrorr   ZPOWER_TIME_UNLIMITEDZPOWER_TIME_UNKNOWNZsbattery)r6   ZminsleftZpower_pluggedZsecsleftrA   rA   rB   rZ   ×   s    rZ   Úinetc          	   C   sr   g }xht ƒ D ]^}yt|ƒ | ¡}W n tk
r8   wY qX |rx*|D ]"}t|ƒ|g }| tj|Ž ¡ qDW qW |S )z System-wide network connections.)ÚpidsÚProcessÚconnectionsr	   ÚlistrG   r   Zsconn)ÚkindrH   ÚpidZconsÚcrA   rA   rB   Únet_connectionsñ   s    
rd   c        
      C   s´   t ƒ  ¡ } i }x | D ]˜}y&t |¡}t |¡}t |¡\}}W n0 tk
rn } z|jtjkr^‚ W dd}~X Y qX t	t
dƒr„t
 |¡}d |¡}d|k}	t
 |	||||¡||< qW |S )z)Get NIC stats (isup, duplex, speed, mtu).NÚ	NicDuplexú,Zrunning)Únet_io_countersÚkeysÚ
cext_posixZ
net_if_mtuZnet_if_flagsZnet_if_duplex_speedÚOSErrorÚerrnoZENODEVÚhasattrr   re   ÚjoinZ	snicstats)
ÚnamesrH   r&   ZmtuÚflagsZduplexZspeedÚerrZoutput_flagsZisuprA   rA   rB   Únet_if_stats  s"    






rq   c               C   s   t  ¡ S )z:The system boot time expressed in seconds since the epoch.)r@   Ú	boot_timerA   rA   rA   rB   rr     s    rr   c        	      C   s`   g } t  ¡ }xN|D ]F}|\}}}}}|dkr.q|s4qt ||p@d|pFd||¡}|  |¡ qW | S )z:Return currently connected users as a list of namedtuples.ú~N)r@   Úusersr   ZsuserrG   )	rU   ÚrawlistrI   r0   ZttyZhostnameZtstamprb   ÚntrA   rA   rB   rt   $  s    
rt   c              C   sd   t  ¡ } d| kr`ytdƒ ¡  |  dd¡ W n2 tk
r@   Y n  tk
r^   |  dd¡ Y nX | S )Nr   )r@   r]   r^   Úcreate_timeÚinsertr	   r   )ZlsrA   rA   rB   r]   8  s    r]   c             C   s6   yt  | ¡td  }|t jkS  tk
r0   dS X d S )Nr%   F)r@   Úproc_kinfo_oneshotÚkinfo_proc_mapÚSZOMBÚ	Exception)rb   ÚstrA   rA   rB   Ú	is_zombieK  s
    
r~   c                s   t  ˆ ¡‡ fdd„ƒ}|S )z`Decorator which translates bare OSError exceptions into
    NoSuchProcess and AccessDenied.
    c                sœ   yˆ | f|ž|ŽS  t k
rP   t| jƒr>t| j| j| jƒ‚nt| j| jƒ‚Y nH tk
rp   t| j| jƒ‚Y n( t	j
k
r–   t| j| j| jƒ‚Y nX d S )N)r   r~   rb   r
   Ú_nameÚ_ppidr	   r   r   r@   ZZombieProcessError)ÚselfÚargsÚkwargs)ÚfunrA   rB   ÚwrapperW  s    
z wrap_exceptions.<locals>.wrapper)Ú	functoolsÚwraps)r„   r…   rA   )r„   rB   Úwrap_exceptionsS  s    rˆ   c               @   sl  e Zd ZdZddddgZdd„ Zeedd	„ ƒƒZe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d@d1d2„ƒZed3d4„ ƒZedAd6d7„ƒZed8d9„ ƒZed:d;„ ƒZ ed<d=„ ƒZ!ed>d?„ ƒZ"d5S )Br^   z1Wrapper class around underlying C implementation.rb   r   r€   Ú_cachec             C   s   || _ d | _d | _d S )N)rb   r   r€   )r   rb   rA   rA   rB   Ú__init__l  s    zProcess.__init__c             C   s$   t  | j¡}t|ƒttƒks t‚|S )N)r@   ry   rb   Úlenrz   ÚAssertionError)r   rH   rA   rA   rB   Ú_get_kinfo_procq  s    zProcess._get_kinfo_procc             C   s$   t  | j¡}t|ƒttƒks t‚|S )N)r@   Zproc_pidtaskinfo_oneshotrb   r‹   Úpidtaskinfo_maprŒ   )r   rH   rA   rA   rB   Ú_get_pidtaskinfoy  s    zProcess._get_pidtaskinfoc             C   s   | j  | ¡ | j | ¡ d S )N)r   Zcache_activater   )r   rA   rA   rB   Úoneshot_enter  s    zProcess.oneshot_enterc             C   s   | j  | ¡ | j | ¡ d S )N)r   Zcache_deactivater   )r   rA   rA   rB   Úoneshot_exit…  s    zProcess.oneshot_exitc             C   s(   |   ¡ td  }|d k	r|S t | j¡S )Nr&   )r   rz   r@   Z	proc_namerb   )r   r&   rA   rA   rB   r&   ‰  s    zProcess.namec             C   s   t  | j¡S )N)r@   Zproc_exerb   )r   rA   rA   rB   ÚexeŽ  s    zProcess.exec             C   s   t  | j¡S )N)r@   Zproc_cmdlinerb   )r   rA   rA   rB   Úcmdline’  s    zProcess.cmdlinec             C   s   t t | j¡ƒS )N)r   r@   Zproc_environrb   )r   rA   rA   rB   Úenviron–  s    zProcess.environc             C   s   |   ¡ td  | _| jS )Nr   )r   rz   r€   )r   rA   rA   rB   r   š  s    zProcess.ppidc             C   s   t  | j¡S )N)r@   Zproc_cwdrb   )r   rA   rA   rB   ÚcwdŸ  s    zProcess.cwdc             C   s.   |   ¡ }t |td  |td  |td  ¡S )Nr   r   r   )r   r   Úpuidsrz   )r   ÚrawtuplerA   rA   rB   Úuids£  s
    

zProcess.uidsc             C   s.   |   ¡ }t |td  |td  |td  ¡S )Nr    r!   r"   )r   r   r–   rz   )r   r—   rA   rA   rB   Úgids«  s
    

zProcess.gidsc             C   s:   |   ¡ td  }t ¡ }y|| S  tk
r4   d S X d S )Nr#   )r   rz   r   Zget_terminal_mapÚKeyError)r   Ztty_nrZtmaprA   rA   rB   Úterminal³  s    zProcess.terminalc             C   s6   |   ¡ }t|td  |td  |td  |td  ƒS )Nr)   r*   r+   r,   )r   r<   rŽ   )r   r—   rA   rA   rB   Úmemory_info¼  s    


zProcess.memory_infoc             C   s"   |   ¡ }t | j¡}t||f Ž S )N)rœ   r@   Zproc_memory_ussrb   r=   )r   Z	basic_memr>   rA   rA   rB   Úmemory_full_infoÆ  s    zProcess.memory_full_infoc             C   s(   |   ¡ }t |td  |td  dd¡S )Nr'   r(   g        )r   r   Z	pcputimesrŽ   )r   r—   rA   rA   rB   rE   Ì  s
    

zProcess.cpu_timesc             C   s   |   ¡ td  S )Nr$   )r   rz   )r   rA   rA   rB   rw   Õ  s    zProcess.create_timec             C   s   |   ¡ td  }t |d¡S )Nr.   r   )r   rŽ   r   Zpctxsw)r   ZvolrA   rA   rB   Únum_ctx_switchesÙ  s    zProcess.num_ctx_switchesc             C   s   |   ¡ td  S )Nr-   )r   rŽ   )r   rA   rA   rB   Únum_threadsá  s    zProcess.num_threadsc             C   sR   | j dkrg S g }t | j ¡}x.|D ]&\}}t|ƒr$t ||¡}| |¡ q$W |S )Nr   )rb   r@   Zproc_open_filesr   r   Z	popenfilerG   )r   Úfilesru   rQ   ÚfdrW   rA   rA   rB   Ú
open_fileså  s    
zProcess.open_filesr\   c          	   C   sˆ   |t kr(td|d dd„ t D ƒ¡f ƒ‚t | \}}t | j||¡}g }x:|D ]2}|\}}}	}
}}t|||	|
||tƒ}| |¡ qNW |S )Nz+invalid %r kind argument; choose between %sz, c             S   s   g | ]}t |ƒ‘qS rA   )Úrepr)Ú.0ÚxrA   rA   rB   ú
<listcomp>õ  s    z'Process.connections.<locals>.<listcomp>)	r   Ú
ValueErrorrm   r@   Zproc_connectionsrb   r   ÚTCP_STATUSESrG   )r   ra   ZfamiliesÚtypesru   rH   rI   r¡   ZfamÚtypeZladdrZraddrr%   rv   rA   rA   rB   r_   ñ  s    
zProcess.connectionsc             C   s   | j dkrdS t | j ¡S )Nr   )rb   r@   Zproc_num_fds)r   rA   rA   rB   Únum_fds   s    
zProcess.num_fdsNc             C   s   t  | j|| j¡S )N)r   Zwait_pidrb   r   )r   ZtimeoutrA   rA   rB   Úwait  s    zProcess.waitc             C   s   t  | j¡S )N)ri   Úgetpriorityrb   )r   rA   rA   rB   Únice_get
  s    zProcess.nice_getc             C   s   t  | j|¡S )N)ri   Úsetpriorityrb   )r   ÚvaluerA   rA   rB   Únice_set  s    zProcess.nice_setc             C   s   |   ¡ td  }t |d¡S )Nr%   ú?)r   rz   ÚPROC_STATUSESÚget)r   ÚcoderA   rA   rB   r%     s    zProcess.statusc             C   s@   t  | j¡}g }x*|D ]"\}}}t |||¡}| |¡ qW |S )N)r@   Zproc_threadsrb   r   ZpthreadrG   )r   ru   rU   Z	thread_idÚutimeZstimerW   rA   rA   rB   Úthreads  s    zProcess.threads)r\   )N)#Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__rŠ   rˆ   r   r   r   r   r‘   r&   r’   r“   r”   r   r•   r˜   r™   r›   rœ   r   rE   rw   rž   rŸ   r¢   r_   r«   r¬   r®   r±   r%   r·   rA   rA   rA   rB   r^   g  sD   	
	r^   )F)r\   )ar»   rk   r†   rP   Úcollectionsr   rN   r   r   r   r@   r   ri   r   r	   r
   r   r   r   r   r   r   Z_compatr   r   Z__extra__all__ZgetpagesizeZ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_STOPPEDr{   ZSTATUS_ZOMBIEr³   Údictrz   rŽ   r/   r4   r<   Ú_fieldsr=   rC   rD   rE   rF   rJ   rK   rL   rM   Z
disk_usageZdisk_io_countersrO   rZ   rg   Znet_if_addrsrd   rq   rr   rt   r]   Z
pid_existsr~   rˆ   Úobjectr^   rA   rA   rA   rB   Ú<module>   s²   



