o
    a?                     @   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g d ZDed!g d"ZEed#g d$ZFed%eFjGd& ZHd'd( ZId)d* ZJd+d, ZKd-d. ZLd/d0 ZMd1d2 ZNd3d4 ZOd5d6 ZPejQZQe
jRZRdMd8d9ZSd:d; ZTe
jUZUejVZVdNd=d>ZWd?d@ ZXdAdB ZYdCdD ZZdEdF Z[ej\Z\dGdH Z]dIdJ Z^G dKdL dLe_Z`dS )Oz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pmem)r)   r*   r+   r,   pfullmem)ussc            	   	   C   sT   t  \} }}}}}|| }|| }||8 }t| | | dd}t| |||||||S )z&System virtual memory as a namedtuple.r   Zround_)cextZvirtual_memr   r5   )	r6   r:   r;   r<   r9   ZspeculativeZavailr8   r7    rB   //usr/lib/python3/dist-packages/psutil/_psosx.pyvirtual_memoryo   s   rD   c                  C   s4   t  \} }}}}t|| dd}t| |||||S )z=Swap system memory as a (total, used, free, sin, sout) tuple.r   r@   )rA   Zswap_memr   r   Zsswap)r6   r8   r9   ZsinZsoutr7   rB   rB   rC   swap_memory   s   rE   c                  C   s   t  \} }}}t| |||S )z(Return system CPU times as a namedtuple.)rA   	cpu_timesr/   r0   rB   rB   rC   rF      s   rF   c                  C   s:   g } t  D ]}|\}}}}t||||}| | q| S )z(Return system CPU times as a named tuple)rA   per_cpu_timesr/   append)retZcpu_tr1   r2   r3   r4   itemrB   rB   rC   rG      s   rG   c                   C      t  S )z0Return the number of logical CPUs in the system.)rA   cpu_count_logicalrB   rB   rB   rC   rL         rL   c                   C   rK   )z-Return the number of CPU cores in the system.)rA   cpu_count_coresrB   rB   rB   rC   rN      rM   rN   c                  C   s"   t  \} }}}}t| |||S N)rA   	cpu_statsr   Z	scpustats)Zctx_switchesZ
interruptsZsoft_interruptsZsyscallsZtrapsrB   rB   rC   rP      s
   rP   c                  C   s   t  \} }}t| ||gS )zReturn 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
    )rA   cpu_freqr   Zscpufreq)ZcurrZmin_Zmax_rB   rB   rC   rQ      s   rQ   Fc              	   C   sv   g }t  }|D ]0}|\}}}}|dkrd}| s%tj|r$tj|s%qd }}	t||||||	}
||
 q|S )z8Return mounted disk partitions as a list of namedtuples.Znone N)	rA   disk_partitionsospathisabsexistsr   Z	sdiskpartrH   )allretlistZ
partitions	partitionZdeviceZ
mountpointZfstypeZoptsZmaxfileZmaxpathntuplerB   rB   rC   rS      s   rS   c                  C   sb   z	t  \} }}W n
 ty   Y dS w |dk}|rtj}n|dkr&tj}n|d }t| ||S )zReturn battery information.Nr   <   )rA   sensors_batteryNotImplementedErrorr   ZPOWER_TIME_UNLIMITEDZPOWER_TIME_UNKNOWNZsbattery)r7   ZminsleftZpower_pluggedZsecsleftrB   rB   rC   r^      s   r^   inetc              	   C   sf   g }t  D ]+}z	t|| }W n	 ty   Y qw |r0|D ]}t||g }|tj|  qq|S )z System-wide network connections.)pidsProcessconnectionsr	   listrH   r   Zsconn)kindrI   pidZconscrB   rB   rC   net_connections   s   
rh   c                  C   s   t   } i }| D ]C}zt|}t|}t|\}}W n ty7 } z|jtjkr- W Y d}~q	d}~ww t	t
drBt
|}t
||||||< q	|S )z)Get NIC stats (isup, duplex, speed, mtu).N	NicDuplex)net_io_counterskeys
cext_posixZ
net_if_mtuZnet_if_is_runningZnet_if_duplex_speedOSErrorerrnoZENODEVhasattrr   ri   Z	snicstats)namesrI   r&   ZmtuZisupZduplexZspeederrrB   rB   rC   net_if_stats  s"   




rr   c                   C   rK   )z:The system boot time expressed in seconds since the epoch.)rA   	boot_timerB   rB   rB   rC   rs     rM   rs   c            	      C   s\   g } t  }|D ]#}|\}}}}}|dkrq|sqt||pd|p"d||}| | q| S )z:Return currently connected users as a list of namedtuples.~N)rA   usersr   ZsuserrH   )	rY   rawlistrJ   r1   ZttyZhostnameZtstamprf   ntrB   rB   rC   ru   !  s   ru   c                  C   sf   t  } d| vr1ztd  | dd W | S  ty!   Y | S  ty0   | dd Y | S w | S Nr   )rA   ra   rb   create_timeinsertr	   r   )ZlsrB   rB   rC   ra   5  s   ra   c                 C   s4   zt | td  }|t jkW S  ty   Y dS w )Nr%   F)rA   proc_kinfo_oneshotkinfo_proc_mapSZOMB	Exception)rf   strB   rB   rC   	is_zombieH  s   r   c                    s   t   fdd}|S )z`Decorator which translates bare OSError exceptions into
    NoSuchProcess and AccessDenied.
    c                    s   z | g|R i |W S  t y(   t| jr!t| j| j| jt| j| j ty5   t| j| j t	j
yE   t| j| j| jw rO   )r   r   rf   r
   _name_ppidr	   r   r   rA   ZZombieProcessError)selfargskwargsfunrB   rC   wrapperT  s   
z wrap_exceptions.<locals>.wrapper)	functoolswraps)r   r   rB   r   rC   wrap_exceptionsP  s   r   c                   @   sh  e Zd ZdZg d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=d.d/Zed0d1 Zed>d3d4Zed5d6 Zed7d8 Z ed9d: Z!ed;d< Z"d2S )?rb   z1Wrapper class around underlying C implementation.)rf   r   r   _cachec                 C   s   || _ d | _d | _d S rO   )rf   r   r   )r   rf   rB   rB   rC   __init__i  s   
zProcess.__init__c                 C   $   t | j}t|ttksJ |S rO   )rA   r{   rf   lenr|   r   rI   rB   rB   rC   _get_kinfo_procn     zProcess._get_kinfo_procc                 C   r   rO   )rA   Zproc_pidtaskinfo_oneshotrf   r   pidtaskinfo_mapr   rB   rB   rC   _get_pidtaskinfov  r   zProcess._get_pidtaskinfoc                 C      | j |  | j|  d S rO   )r   Zcache_activater   r   rB   rB   rC   oneshot_enter~     zProcess.oneshot_enterc                 C   r   rO   )r   Zcache_deactivater   r   rB   rB   rC   oneshot_exit  r   zProcess.oneshot_exitc                 C   s(   |   td  }|d ur|S t| jS )Nr&   )r   r|   rA   Z	proc_namerf   )r   r&   rB   rB   rC   r&     s   zProcess.namec                 C      t | jS rO   )rA   Zproc_exerf   r   rB   rB   rC   exe     zProcess.exec                 C   r   rO   )rA   Zproc_cmdlinerf   r   rB   rB   rC   cmdline  r   zProcess.cmdlinec                 C   s   t t| jS rO   )r   rA   Zproc_environrf   r   rB   rB   rC   environ     zProcess.environc                 C   s   |   td  | _| jS )Nr   )r   r|   r   r   rB   rB   rC   r     s   zProcess.ppidc                 C   r   rO   )rA   Zproc_cwdrf   r   rB   rB   rC   cwd  r   zProcess.cwdc                 C   .   |   }t|td  |td  |td  S )Nr   r   r   r   r   Zpuidsr|   r   ZrawtuplerB   rB   rC   uids     


zProcess.uidsc                 C   r   )Nr    r!   r"   r   r   rB   rB   rC   gids  r   zProcess.gidsc                 C   s8   |   td  }t }z|| W S  ty   Y d S w )Nr#   )r   r|   r   Zget_terminal_mapKeyError)r   Ztty_nrZtmaprB   rB   rC   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   rB   rB   rC   memory_info  s   



zProcess.memory_infoc                 C   s"   |   }t| j}t||f  S rO   )r   rA   Zproc_memory_ussrf   r>   )r   Z	basic_memr?   rB   rB   rC   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   rB   rB   rC   rF     s   

zProcess.cpu_timesc                 C      |   td  S )Nr$   )r   r|   r   rB   rB   rC   ry     r   zProcess.create_timec                 C      |   td  }t|dS )Nr.   r   )r   r   r   Zpctxsw)r   ZvolrB   rB   rC   num_ctx_switches  s   zProcess.num_ctx_switchesc                 C   r   )Nr-   )r   r   r   rB   rB   rC   num_threads  r   zProcess.num_threadsc                 C   sN   | j dkrg S g }t| j }|D ]\}}t|r$t||}|| q|S rx   )rf   rA   Zproc_open_filesr   r   Z	popenfilerH   )r   filesrv   rU   fdr[   rB   rB   rC   
open_files  s   

zProcess.open_filesr`   c              	   C   s   |t vrtd|ddd t D f t | \}}t| j||}g }|D ]}|\}}}	}
}}t|||	|
||t}|| q&|S )Nz+invalid %r kind argument; choose between %sz, c                 S   s   g | ]}t |qS rB   )repr).0xrB   rB   rC   
<listcomp>  s    z'Process.connections.<locals>.<listcomp>)	r   
ValueErrorjoinrA   Zproc_connectionsrf   r   TCP_STATUSESrH   )r   re   Zfamiliestypesrv   rI   rJ   r   ZfamtypeZladdrZraddrr%   rw   rB   rB   rC   rc     s   zProcess.connectionsc                 C   s   | j dkrdS t| j S rx   )rf   rA   Zproc_num_fdsr   rB   rB   rC   num_fds  s   
zProcess.num_fdsNc                 C   s   t | j|| jS rO   )r   Zwait_pidrf   r   )r   ZtimeoutrB   rB   rC   wait  s   zProcess.waitc                 C   r   rO   )rl   getpriorityrf   r   rB   rB   rC   nice_get  r   zProcess.nice_getc                 C   s   t | j|S rO   )rl   setpriorityrf   )r   valuerB   rB   rC   nice_set  s   zProcess.nice_setc                 C   r   )Nr%   ?)r   r|   PROC_STATUSESget)r   coderB   rB   rC   r%     s   zProcess.statusc                 C   s<   t | j}g }|D ]\}}}t|||}|| q
|S rO   )rA   Zproc_threadsrf   r   ZpthreadrH   )r   rv   rY   Z	thread_idutimeZstimer[   rB   rB   rC   threads  s   zProcess.threadsr`   rO   )#__name__
__module____qualname____doc__	__slots__r   r   r   r   r   r   r   r&   r   r   r   r   r   r   r   r   r   r   rF   ry   r   r   r   rc   r   r   r   r   r%   r   rB   rB   rB   rC   rb   d  st    









	









rb   )Fr   )ar   rn   r   rT   collectionsr   rR   r   r   r   rA   r   rl   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   dictr|   r   r/   r5   r=   _fieldsr>   rD   rE   rF   rG   rL   rN   rP   rQ   
disk_usageZdisk_io_countersrS   r^   rj   Znet_if_addrsrh   rr   rs   ru   ra   Z
pid_existsr   r   objectrb   rB   rB   rB   rC   <module>   s   


