B
    چ\|                 @   s  d Z ddlZddlZddlZddlZddlm  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 ddlmZ ddlm Z  g Z!erVe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/iZ0nesberej"ej#ej&ej'ej(ej)ej1ej+ej*ej+ej$ej2ej3ej%iZ0nBerej"ej#ej4ej%ej5ej+ej(ej)ej*ej+ej1ej6ej7ej8iZ0ej9ej:ej;ej<ej=ej>ej?ej@ejAejBejCejDejEejFejGejHejIejJejKejLejMejNejOejPiZQerXeRdZSn
eRdZSejTZTeUedZVeUedZWeUedZXeUedZYeZddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3Z[dZ\dZ]dZ^dZ_e
d4d5d6d7d8d9d:d;d<d=d>d?gZ`e
d@dAdBdCdDdEgZae
dFdGdHdIdJdKgZbebZce
dLdAdCdMdNgZde
dOdPZee
dQdRZferle
dSdTdUdVdWdXdYdZgZgne
dSdTdUdVdWgZgd[d\ Zhd]d^ Zid_d` ZjeVrdad Zkndbd Zkdcek_lddde Zmeserdfdg Znndhdg Zndidj ZoddkdlZpejqZqejrZrejsZsejtZtdmdn Zudodp Zver2dqdr Zwdsdt Zxdudv Zydwdx Zzdydz Z{ed{d| Z|d}d~ Z}esberldd Z~nej~Z~dd Zejdd ZG dd deZdS )z5FreeBSD, OpenBSD and NetBSD platforms implementation.    N)
namedtuple)AF_INET)defaultdict   )_common)_psposix)_psutil_bsd)_psutil_posix)AF_INET6)	conn_tmap)FREEBSD)memoize)memoize_when_activated)NETBSD)OPENBSD)sockfam_to_enum)socktype_to_enum)usage_percent)whichSC_PAGESIZESC_PAGE_SIZEper_cpu_timesproc_num_threadsproc_open_filesproc_num_fds                     	   
                                             )ppidstatusreal_uideffective_uid	saved_uidreal_gideffective_gid	saved_gidttynrcreate_timectx_switches_volctx_switches_unvolread_io_countwrite_io_count	user_timesys_timech_user_timech_sys_timerssvmsmemtextmemdatamemstackcpunumnamesvmemtotalZ	availablepercentusedfreeactiveinactivebufferscachedsharedwired	scputimesusernicesystemidleirqpmemrD   rE   textdatastack	pcputimeschildren_userchildren_systempmmap_groupedz*path rss, private, ref_count, shadow_count	pmmap_extz6addr, perms path rss, private, ref_count, shadow_countsdiskioZ
read_countZwrite_countZ
read_bytesZwrite_bytesZ	read_timeZ
write_timeZ	busy_timec              C   s   t  } | \}}}}}}}}trtddR}	xJ|	D ]B}
|
drVt|
 d d }q2|
dr2t|
 d d }q2W W dQ R X || | }|| | }t|| |dd}t|||||||||||S )	z&System virtual memory as a namedtuple.z/proc/meminforbs   Buffers:r   i   s
   MemShared:N)round_)	cextZvirtual_memr   open
startswithintsplitr   rK   )ZmemrL   rO   rP   rQ   rU   rS   rR   rT   flineZavailrN   rM    ro   ,lib/python3.7/site-packages/psutil/_psbsd.pyvirtual_memory   s    


"rq   c              C   s4   t  \} }}}}t|| dd}t| |||||S )z@System swap memory as (total, used, free, sin, sout) namedtuple.r   )rg   )rh   Zswap_memr   r   Zsswap)rL   rN   rO   ZsinZsoutrM   ro   ro   rp   swap_memory   s    rr   c              C   s"   t  \} }}}}t| ||||S )z+Return system per-CPU times as a namedtuple)rh   	cpu_timesrV   )rW   rX   rY   rZ   r[   ro   ro   rp   rs      s    rs   c              C   sB   g } x8t  D ],}|\}}}}}t|||||}| | qW | S )z'Return system CPU times as a namedtuple)rh   r   rV   append)retZcpu_trW   rX   rY   rZ   r[   itemro   ro   rp   r      s    c               C   s.   t  dkrt gS tjr tddt_t gS )z'Return system CPU times as a namedtupler   z&supported only starting from FreeBSD 8T)cpu_count_logicalrs   r   
__called__NotImplementedErrorro   ro   ro   rp   r      s    
Fc               C   s   t  S )z0Return the number of logical CPUs in the system.)rh   rw   ro   ro   ro   rp   rw      s    rw   c               C   s   t  dkrdS d S )Nr   )rw   ro   ro   ro   rp   cpu_count_physical  s    rz   c              C   sx   d} t  }|dk	rb|d}|dkrb|d|d  }t|}zt|dpRd} W d|  X | stt dkrtdS | S )z1Return the number of physical CPUs in the system.Nz	</groups>r"   zgroup/children/group/cpur   )	rh   Zcpu_count_physrfindETZ
fromstringlenfindallclearrw   )ru   sindexrootro   ro   rp   rz     s    



c        	   	   C   s   t rt \} }}}}nttrrt \} }}}}}}tdd.}x&|D ]}|drDt| d }qDW W dQ R X ntrt \} }}}}}}t	
| |||S )z*Return various CPU stats as a named tuple.z
/proc/statrf   s   intrr   N)r   rh   	cpu_statsr   ri   rj   rk   rl   r   r   Z	scpustats)	ZctxswZintrsZ
soft_intrsZsyscallsZtrapsZfaultsZforksrm   rn   ro   ro   rp   r   #  s    

 r   c       	      C   sD   g }t  }x2|D ]*}|\}}}}t||||}|| qW |S )zReturn mounted disk partitions as a list of namedtuples.
    'all' argument is ignored, see:
    https://github.com/giampaolo/psutil/issues/906
    )rh   disk_partitionsr   Z	sdiskpartrt   )	allretlistZ
partitions	partitionZdeviceZ
mountpointZfstypeZoptsntuplero   ro   rp   r   F  s    
r   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rt
|}t
||||||< qW |S )z)Get NIC stats (isup, duplex, speed, mtu).N	NicDuplex)net_io_counterskeys
cext_posixZ
net_if_mtuZnet_if_flagsZnet_if_duplex_speedOSErrorerrnoZENODEVhasattrr   r   Z	snicstats)namesru   rJ   ZmtuZisupZduplexZspeederrro   ro   rp   net_if_statsa  s    





r   c          
   C   s  t rzg }xlt D ]b}yt|| }W n ttfk
r@   wY qX x.|D ]&}t|}|| |tj	|  qHW qW |S | tj
krtd| ddd t
D f t
|  \}}t }trtd}nt }x|D ]}|\}	}
}}}}}|
|kr||kryt| }W n  tk
r&   ttj }Y nX |
ttfkrV|rFtj| }|rVtj| }t|
}
t|}t	|	|
|||||}|| qW t|S )z System-wide network connections.z+invalid %r kind argument; choose between %sz, c             S   s   g | ]}t |qS ro   )repr).0xro   ro   rp   
<listcomp>  s    z#net_connections.<locals>.<listcomp>r{   )r   pidsProcessconnectionsNoSuchProcessZombieProcesslistrt   r   Zsconnr   
ValueErrorjoinsetr   rh   net_connectionsTCP_STATUSESKeyErrorPSUTIL_CONN_NONEr   r
   addrr   r   add)kindru   pidZconsZconnfamiliestypesrawlistrv   fdfamtypeladdrraddrr3   ntro   ro   rp   r   u  sJ    





r   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 info.Nr   r{   <   )rh   sensors_batteryry   r   ZPOWER_TIME_UNLIMITEDZPOWER_TIME_UNKNOWNZsbattery)rM   ZminsleftZpower_pluggedZsecsleftro   ro   rp   r     s    r   c           	   C   sz   t t} t }xft|D ]Z}y@t|\}}|dkr8d}d| }| d t|||| W q t	k
rp   Y qX qW | S )z?Return CPU cores temperatures if available, else an empty dict.r   NzCore %sZcoretemp)
r   r   rw   rangerh   Zsensors_cpu_temperaturert   r   Zshwtempry   )ru   num_cpuscpucurrentZhighrJ   ro   ro   rp   sensors_temperatures  s    
r   c           
   C   s   g } t  }xt|D ]}yt|\}}W n tk
r@   wY nX |ry t|dd dd }W n ttfk
r   d}Y nX y t|dd dd }W n ttfk
r   d}Y nX | 	t
||| qW | S )zReturn frequency metrics for CPUs. As of Dec 2018 only
        CPU 0 appears to be supported by FreeBSD and all other cores
        match the frequency of CPU 0.
         r{   /r   N)rw   r   rh   Zcpu_frequencyry   rk   rl   
IndexErrorr   rt   r   Zscpufreq)ru   r   r   r   Zavailable_freqZmin_freqZmax_freqro   ro   rp   cpu_freq  s$     
 
r   c               C   s   t  S )z:The system boot time expressed in seconds since the epoch.)rh   	boot_timero   ro   ro   rp   r     s    r   c        	      C   sj   g } t  }xX|D ]P}|\}}}}}|dkr8ts4td}|dkrBqt||pNd|||}| | qW | S )z:Return currently connected users as a list of namedtuples.r{   N~)rh   usersr   AssertionErrorr   Zsuserrt   )	r   r   rv   rW   ZttyZhostnameZtstampr   r   ro   ro   rp   r     s    
r   c               C   s@   yt d  W n& tk
r$   dS  tk
r6   dS X dS d S )Nr   FT)r   rJ   r   AccessDeniedro   ro   ro   rp   _pid_0_exists  s    r   c              C   s*   t  } tr&d| kr&t r&| dd | S )z7Returns a list of PIDs currently running on the system.r   )rh   r   r   r   insert)ru   ro   ro   rp   r     s    r   c             C   s    t | }|s| t kS dS dS )zReturn True if pid exists.TN)r   
pid_existsr   )r   existsro   ro   rp   r     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
r } z| jdkrHdt krFt| j| jn |jtjkrt| jsnt| j| jnt	| j| j| j
|jtjtjfkrt| j| j W d d }~X Y nX d S )Nr   )r   r   r   r   _namer   ESRCHr   r   r   _ppidEPERMEACCES)selfargskwargsr   )funro   rp   wrapper.  s    


z wrap_exceptions.<locals>.wrapper)	functoolswraps)r   r   ro   )r   rp   wrap_exceptions*  s    r   c          
   c   s   y
dV  W n t k
r } zd|jtjtjfkrZt| jsHt| j| jnt| j| j| j	|jtj
tjfkrzt| j| j W dd}~X Y nX dS )z8Same as above, for routines relying on reading /proc fs.N)EnvironmentErrorr   ZENOENTr   r   r   r   r   r   r   r   r   r   )Zinstr   ro   ro   rp   wrap_exceptions_procfsC  s    

r   c               @   s  e Zd ZdZddddgZdd Z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red d! Zed"d# ZeZed$d% Zed&d' Zed(d) Zed*d+ ZedKd-d.ZedLd0d1Zed2d3 Zed4d5 Zed6d7 Z ed8d9 Z!ed:d; Z"e#d<d=Z$e#d<d>Z%d?d@ Z&e'redAdB Z(ne&Z(e)redCdD Z*ne&Z*eredEdF Z+edGdH Z,edIdJ Z-d/S )Mr   z1Wrapper class around underlying C implementation.r   r   r   _cachec             C   s   || _ d | _d | _d S )N)r   r   r   )r   r   ro   ro   rp   __init__[  s    zProcess.__init__c             C   s   t | j dS )z+Raise NSP if the process disappeared on us.N)rh   	proc_namer   )r   ro   ro   rp   _assert_alive`  s    zProcess._assert_alivec             C   s$   t | j}t|ttks t|S )z;Retrieves multiple process info in one shot as a raw tuple.)rh   Zproc_oneshot_infor   r~   kinfo_proc_mapr   )r   ru   ro   ro   rp   oneshotf  s    zProcess.oneshotc             C   s   | j |  d S )N)r   Zcache_activate)r   ro   ro   rp   oneshot_entern  s    zProcess.oneshot_enterc             C   s   | j |  d S )N)r   Zcache_deactivate)r   ro   ro   rp   oneshot_exitq  s    zProcess.oneshot_exitc             C   s(   |   td  }|d k	r|S t| jS )NrJ   )r   r   rh   r   r   )r   rJ   ro   ro   rp   rJ   t  s    zProcess.namec          	   C   sd   t rt| jS trD| jdkr"dS t|  td| j S Q R X n|  }|r\t	|d S dS d S )Nr    z/proc/%s/exe)
r   rh   Zproc_exer   r   r   osreadlinkcmdliner   )r   r   ro   ro   rp   exey  s    

zProcess.exec          
   C   s   t r| jdkrg S tryt| jS  tk
r } z@|jtjkrnt| jsZt	| j| j
qpt| j| j
| jn W d d }~X Y qX nt| jS d S )Nr   )r   r   r   rh   Zproc_cmdliner   r   EINVALr   r   r   r   r   )r   r   ro   ro   rp   r     s    
zProcess.cmdlinec             C   s:   |   td  }t }y|| S  tk
r4   d S X d S )Nr:   )r   r   r   Zget_terminal_mapr   )r   Ztty_nrZtmapro   ro   rp   terminal  s    zProcess.terminalc             C   s   |   td  | _| jS )Nr2   )r   r   r   )r   ro   ro   rp   r2     s    zProcess.ppidc             C   s.   |   }t|td  |td  |td  S )Nr4   r5   r6   )r   r   Zpuidsr   )r   rawtuplero   ro   rp   uids  s
    

zProcess.uidsc             C   s.   |   }t|td  |td  |td  S )Nr7   r8   r9   )r   r   Zpgidsr   )r   r   ro   ro   rp   gids  s
    

zProcess.gidsc             C   s8   |   }t|td  |td  |td  |td  S )Nr@   rA   rB   rC   )r   r   r`   r   )r   r   ro   ro   rp   rs     s    


zProcess.cpu_timesc             C   s   |   td  S )NrI   )r   r   )r   ro   ro   rp   cpu_num  s    zProcess.cpu_numc             C   s@   |   }t|td  |td  |td  |td  |td  S )NrD   rE   rF   rG   rH   )r   r\   r   )r   r   ro   ro   rp   memory_info  s    



zProcess.memory_infoc             C   s   |   td  S )Nr;   )r   r   )r   ro   ro   rp   r;     s    zProcess.create_timec             C   s    t rt| jS t|  S d S )N)HAS_PROC_NUM_THREADSrh   r   r   r~   threads)r   ro   ro   rp   num_threads  s    zProcess.num_threadsc             C   s$   |   }t|td  |td  S )Nr<   r=   )r   r   Zpctxswr   )r   r   ro   ro   rp   num_ctx_switches  s    
zProcess.num_ctx_switchesc             C   sL   t | j}g }x*|D ]"\}}}t|||}|| qW trH|   |S )N)rh   Zproc_threadsr   r   Zpthreadrt   r   r   )r   r   r   Z	thread_idutimeZstimer   ro   ro   rp   r     s    zProcess.threadsinetc          	   C   s  |t kr(td|ddd t D f trt | \}}t }t| j}x|D ]}|\}}}	}
}}}|| jksvt||krR|	|krRyt	| }W n t
k
r   t	tj }Y nX |ttfkr|
rtj|
 }
|rtj| }t|}t|	}	t|||	|
||}|| qRW |   t|S t | \}}t| j||}g }x|D ]z}|\}}}	}
}}|ttfkr|
rttj|
 }
|rtj| }t|}t|	}	t	| }t|||	|
||}|| qBW tr|   |S )Nz+invalid %r kind argument; choose between %sz, c             S   s   g | ]}t |qS ro   )r   )r   r   ro   ro   rp   r      s    z'Process.connections.<locals>.<listcomp>)r   r   r   r   r   rh   r   r   r   r   r   r   r   r
   r   r   r   r   Zpconnr   r   r   Zproc_connectionsrt   r   )r   r   r   r   ru   r   rv   r   r   r   r   r   r3   r   r   ro   ro   rp   r     sX    





zProcess.connectionsNc             C   s   t | j|| jS )N)r   Zwait_pidr   r   )r   Ztimeoutro   ro   rp   wait-  s    zProcess.waitc             C   s   t | jS )N)r   getpriorityr   )r   ro   ro   rp   nice_get1  s    zProcess.nice_getc             C   s   t | j|S )N)r   setpriorityr   )r   valuero   ro   rp   nice_set5  s    zProcess.nice_setc             C   s   |   td  }t|dS )Nr3   ?)r   r   PROC_STATUSESget)r   codero   ro   rp   r3   9  s    zProcess.statusc             C   s(   |   }t|td  |td  ddS )Nr>   r?   r{   )r   r   Zpior   )r   r   ro   ro   rp   io_counters?  s    

zProcess.io_countersc          	   C   s`   t r| jdkrdS tr8t|  td| j S Q R X n$trLt| jpJdS t	t
rVdnddS )z)Return process current working directory.r   Nz/proc/%s/cwdz&supported only starting from FreeBSD 8r   )r   r   r   r   r   r   HAS_PROC_OPEN_FILESrh   Zproc_cwdry   r   )r   ro   ro   rp   cwdH  s    
zProcess.cwdZmmapz*path rss, private, ref_count, shadow_countz6addr, perms path rss, private, ref_count, shadow_countc             C   s   t d S )N)ry   )r   ro   ro   rp   _not_implemented`  s    zProcess._not_implementedc             C   s   t | j}dd |D S )z8Return files opened by process as a list of namedtuples.c             S   s   g | ]\}}t ||qS ro   )r   Z	popenfile)r   pathr   ro   ro   rp   r   j  s    z&Process.open_files.<locals>.<listcomp>)rh   r   r   )r   r   ro   ro   rp   
open_filesf  s    zProcess.open_filesc             C   s   t | j}tr|   |S )z=Return the number of file descriptors opened by this process.)rh   r   r   r   r   )r   ru   ro   ro   rp   num_fdsq  s    zProcess.num_fdsc             C   s   t | jS )N)rh   Zproc_cpu_affinity_getr   )r   ro   ro   rp   cpu_affinity_get  s    zProcess.cpu_affinity_getc          
   C   s   t ttt }x$|D ]}||krtd||f qW yt| j| W n\ tk
r } z>|j	t	j
t	jfkrx$|D ]}||krttd||f qtW  W d d }~X Y nX d S )Nz#invalid CPU #%i (choose between %s))tupler   r~   r   r   rh   Zproc_cpu_affinity_setr   r   r   r   ZEDEADLK)r   ZcpusZallcpusr   r   ro   ro   rp   cpu_affinity_set  s    

zProcess.cpu_affinity_setc             C   s   t | jS )N)rh   Zproc_memory_mapsr   )r   ro   ro   rp   memory_maps  s    zProcess.memory_maps)r   )N).__name__
__module____qualname____doc__	__slots__r   r   r   r   r   r   r   rJ   r   r   r   r2   r   r   rs   r   r   r   Zmemory_full_infor;   r   r   r   r   r   r   r   r3   r   r   r   Znt_mmap_groupedZnt_mmap_extr   r   r   HAS_PROC_NUM_FDSr   r   r  r  ro   ro   ro   rp   r   V  s`   		
0	r   )F)r  
contextlibr   r   r   Zxml.etree.ElementTreeZetreeZElementTreer}   collectionsr   Zsocketr   r   r   r   r   r   rh   r	   r   r
   r   r   r   r   r   r   r   r   r   Z_compatr   Z__extra__all__ZSIDLZSTATUS_IDLEZSRUNZSTATUS_RUNNINGZSSLEEPZSTATUS_SLEEPINGZSSTOPZSTATUS_STOPPEDZSZOMBZSTATUS_ZOMBIEZSWAITZSTATUS_WAITINGZSLOCKZSTATUS_LOCKEDr   ZSDEADZSTATUS_WAKINGZSONPROCZSACTIVEZSDYINGZSTATUS_DEADZ
SSUSPENDEDZSTATUS_SUSPENDEDZ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_CLOSINGr   Z	CONN_NONEr   sysconfZPAGESIZEZAF_LINKr   ZHAS_PER_CPU_TIMESr   r   r	  dictr   r   r   r   ZTimeoutExpiredrK   rV   r\   Zpfullmemr`   rc   rd   re   rq   rr   rs   r   rx   rw   rz   r   r   Z
disk_usageZdisk_io_countersr   Znet_if_addrsr   r   r   r   r   r   r   r   r   r   r   contextmanagerr   objectr   ro   ro   ro   rp   <module>   s.  




	


	
#
6


