U
    !hx                     @   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 ddlmZ ddlmZ g ZerPe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Z,n~ere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Z,n:erejejej"ej#ej$ej%ej&ej'ej ej.ej/ej!iZ,ej0ej1ej2ej3ej4ej5ej6ej7ej8ej9ej:ej;ej<ej=ej>ej?ej@ejAejBejCejDejEejFejGiZHeI ZJejKZKeLedZMeNd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/ZOed0d1d2d3d4d5d6d7d8d9d:d;gZPed<d=d>d?d@dAgZQedBdCdDdEdFdGgZReRZSedHd=d?dIdJgZTedKdLZUedMdNZVeredOdPdQdRdSdTdUdVgZWnedOdPdQdRdSgZWdWdX ZXdYdZ ZYd[d\ ZZd]d^ Z[d_d` Z\es\erfdadb Z]ndcdb Z]ddde Z^erdfdg Z_nerdhdg Z_ddjdkZ`ejaZaejbZbejcZcejdZddldm Zedndo Zferdpdq Zgdrds Zhdtdu Zier4z
ei ZjW n6 ekk
r* Zl zedvel dZjW 5 dZl[lX Y nX dwdx Zmdydz Zned{d| Zod}d~ Zper`dd Zqnerpdd ZqnejqZqdd Zrdd Zsejtdd ZuG dd dZvdS )z5FreeBSD, OpenBSD and NetBSD platforms implementation.    N)defaultdict)
namedtuple)ElementTree   )_common)_psposix)_psutil_bsd)_psutil_posix)FREEBSD)NETBSD)OPENBSD)AccessDenied)NoSuchProcess)ZombieProcess)	conn_tmap)conn_to_ntuple)debug)memoize)memoize_when_activated)usage_percentproc_num_threads                     	   
                                             )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pmemr@   rA   textdatastack	pcputimeschildren_userchildren_systempmmap_grouped*path rss, private, ref_count, shadow_count	pmmap_ext6addr, 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r| \}}}}}}tddN}|D ]B}|drPt| d d }	q,|dr,t| d d }
q,W 5 Q R X || }|| }n,| \}}}}}}}	}
|| | }|| | }t|| |dd}t||||||||	||
|S )Nz/proc/meminforbs   Buffers:r   i   s
   MemShared:Zround_)	cextZvirtual_memr   open
startswithintsplitr   rG   )ZmemrH   rK   rL   rM   rQ   rO   flinerN   rP   rJ   ZavailrI    rm   3./venv/lib/python3.8/site-packages/psutil/_psbsd.pyvirtual_memory   s8    

 
ro   c                  C   s4   t  \} }}}}t|| dd}t| |||||S )z@System swap memory as (total, used, free, sin, sout) namedtuple.r   re   )rf   Zswap_memr   r   Zsswap)rH   rJ   rK   ZsinZsoutrI   rm   rm   rn   swap_memory   s    rp   c                  C   s"   t  \} }}}}t| ||||S )z,Return system per-CPU times as a namedtuple.)rf   	cpu_timesrR   )rS   rT   rU   rV   rW   rm   rm   rn   rq      s    rq   c                  C   s>   g } t  D ],}|\}}}}}t|||||}| | q| S )z(Return system CPU times as a namedtuple.)rf   per_cpu_timesrR   append)retZcpu_trS   rT   rU   rV   rW   itemrm   rm   rn   rr      s    rr   c                   C   s   t  S )z0Return the number of logical CPUs in the system.)rf   cpu_count_logicalrm   rm   rm   rn   rv      s    rv   c                   C   s   t  dkrdS d S )Nr   )rv   rm   rm   rm   rn   cpu_count_cores   s    rw   c                  C   sx   d} t  }|dk	rb|d}|dkrb|d|d  }t|}zt|dpRd} W 5 |  X | stt dkrtdS | S )z-Return the number of CPU cores in the system.Nz	</groups>r   zgroup/children/group/cpur   )	rf   Zcpu_topologyrfindr   Z
fromstringclearlenfindallrv   )rt   sindexrootrm   rm   rn   rw     s    



c            	   	   C   s   t rt \} }}}}nptrnt \} }}}}}}tdd*}|D ]}|drBt| d }qBW 5 Q R X ntrt \} }}}}}}t	
| |||S )z*Return various CPU stats as a named tuple.z
/proc/statrd   s   intrr   )r
   rf   	cpu_statsr   rg   rh   ri   rj   r   r   Z	scpustats)	ZctxswZintrsZ
soft_intrsZsyscallsZ_trapsZ_faultsZ_forksrk   rl   rm   rm   rn   r   !  s    
r   c               
   C   s   g } t  }t|D ]}zt|\}}W n tk
r@   Y qY nX |rz t|dd dd }W n ttfk
r   d}Y nX z t|dd dd }W n ttfk
r   d}Y nX | 	t
||| q| 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.
         rx   /r   N)rv   rangerf   cpu_freqNotImplementedErrorri   rj   
IndexError
ValueErrorrs   r   scpufreq)rt   num_cpuscpucurrentZavailable_freqZmin_freqZmax_freqrm   rm   rn   r   C  s$    
 
 
r   c                  C   s   t t } t| ddgS )Ng        )floatrf   r   r   r   )Zcurrrm   rm   rn   r   ]  s    Fc           	      C   s@   g }t  }|D ]*}|\}}}}t||||}|| q|S )zReturn mounted disk partitions as a list of namedtuples.
    'all' argument is ignored, see:
    https://github.com/giampaolo/psutil/issues/906.
    )rf   disk_partitionsr   Z	sdiskpartrs   )	allretlistZ
partitions	partitionZdeviceZ
mountpointZfstypeZoptsntuplerm   rm   rn   r   g  s    r   c            
      C   s   t   } i }| D ]}z&t|}t|}t|\}}W n0 tk
rl } z|jtjkr\ W 5 d}~X Y qX t	t
drt
|}d|}d|k}	t
|	||||||< q|S )z)Get NIC stats (isup, duplex, speed, mtu).N	NicDuplex,running)net_io_counterskeys
cext_posixZ
net_if_mtuZnet_if_flagsZnet_if_duplex_speedOSErrorerrnoZENODEVhasattrr   r   joinZ	snicstats)
namesrt   rF   ZmtuflagsZduplexZspeederrZoutput_flagsZisuprm   rm   rn   net_if_stats  s,    





    
r   c              
   C   s   t |  \}}t }tr&td||}ntr8td| }nt||}|D ]6}|\}}}}	}
}}t||||	|
|t|}|| qHt	|S )z System-wide network connections.rx   )
r   setr   rf   net_connectionsr   r   TCP_STATUSESaddlist)kindfamiliestypesrt   rawlistru   fdfamtypeladdrraddrr/   pidntrm   rm   rn   r     s*           r   c                  C   sd   zt  \} }}W n tk
r(   Y dS X |dk}|r>tj}n|dkrNtj}n|d }t| ||S )zReturn battery info.Nr   rx   <   )rf   sensors_batteryr   r   ZPOWER_TIME_UNLIMITEDZPOWER_TIME_UNKNOWNZsbattery)rI   ZminsleftZpower_pluggedZsecsleftrm   rm   rn   r     s    r   c               	   C   sx   t t} t }t|D ]\}zBt|\}}|dkr6d}d| }| d t|||| W q t	k
rp   Y qX q| S )z?Return CPU cores temperatures if available, else an empty dict.r   NzCore Zcoretemp)
r   r   rv   r   rf   Zsensors_cpu_temperaturers   r   Zshwtempr   )rt   r   r   r   ZhighrF   rm   rm   rn   sensors_temperatures  s    
r   c                   C   s   t  S )z:The system boot time expressed in seconds since the epoch.)rf   	boot_timerm   rm   rm   rn   r     s    r   zignoring exception on import: c                 C   sN   t dkr| S t t  }|dks*t|dk r.| S td |dk rF| | S | | S )z!Account for system clock updates.r   r   z9system clock was updated; adjusting process create_time())INIT_BOOT_TIMEr   absr   )ctimeZdiffrm   rm   rn   adjust_proc_create_time  s    
r   c            	      C   s^   g } t rt nt }|D ]<}|\}}}}}|dkr8qt||pDd|||}| | q| S )z:Return currently connected users as a list of namedtuples.~N)r   rf   usersr   r   Zsuserrs   )	r   r   ru   rS   ZttyZhostnameZtstampr   r   rm   rm   rn   r     s    r   c                   C   sD   zt d  W n* tk
r&   Y dS  tk
r:   Y dS X dS d S )Nr   FT)ProcessrF   r   r   rm   rm   rm   rn   _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   )rf   pidsr   r   insert)rt   rm   rm   rn   r     s    r   c                 C   s    t | }|s| t kS dS d S )NTr   
pid_existsr   r   existsrm   rm   rn   r   $  s    

r   c                 C   s    t | }|sdS | t kS d S )NFr   r   rm   rm   rn   r   /  s    
c                 C   s@   z$t | td  }t|tjkW S  tk
r:   Y dS X d S )Nr/   F)rf   proc_oneshot_infokinfo_proc_mapPROC_STATUSESgetr   STATUS_ZOMBIEr   )r   strm   rm   rn   	is_zombie=  s
    r   c                    s   t   fdd}|S )z`Decorator which translates bare OSError exceptions into
    NoSuchProcess and AccessDenied.
    c              
      s   | j | j| j  }}}z | f||W S  tk
rl } z&t|rPt||||t|||W 5 d }~X Y nn tk
r } zt|||W 5 d }~X Y nB t	k
r } z$|dkrdt
 krt||| W 5 d }~X Y nX d S )Nr   )r   _ppid_nameProcessLookupErrorr   r   r   PermissionErrorr   r   r   )selfargskwargsr   r.   rF   r   funrm   rn   wrapperJ  s    z wrap_exceptions.<locals>.wrapper)	functoolswraps)r   r   rm   r   rn   wrap_exceptionsE  s    r   c              
   c   s   | j | j| j  }}}z
dV  W nx ttfk
rl } z*t| j rPt||||nt|||W 5 d}~X Y n. tk
r } zt	|||W 5 d}~X Y nX dS )z8Same as above, for routines relying on reading /proc fs.N)
r   r   r   r   FileNotFoundErrorr   r   r   r   r   )instr   rF   r.   r   rm   rm   rn   wrap_exceptions_procfs]  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d d! Zered"d# Zed$d% ZeZedNd'd(Zed)d* Zed+d, Zed-d. ZedOd0d1ZedPd3d4Zed5d6 Zed7d8 Z ed9d: Z!ed;d< Z"ed=d> Z#e$d?d@Z%e$d?dAZ&edBdC Z'edDdE Z(eredFdG Z)edHdI Z*edJdK Z+edQdLdMZ,d2S )Rr   z1Wrapper class around underlying C implementation._cacher   r   r   c                 C   s   || _ d | _d | _d S N)r   r   r   )r   r   rm   rm   rn   __init__t  s    zProcess.__init__c                 C   s   t | j dS )z+Raise NSP if the process disappeared on us.N)rf   	proc_namer   r   rm   rm   rn   _assert_alivey  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.)rf   r   r   r{   r   AssertionErrorr   rt   rm   rm   rn   oneshot  s    zProcess.oneshotc                 C   s   | j |  d S r   )r   Zcache_activater   rm   rm   rn   oneshot_enter  s    zProcess.oneshot_enterc                 C   s   | j |  d S r   )r   Zcache_deactivater   rm   rm   rn   oneshot_exit  s    zProcess.oneshot_exitc                 C   s(   |   td  }|d k	r|S t| jS )NrF   )r   r   rf   r   r   )r   rF   rm   rm   rn   rF     s    zProcess.namec              
   C   s   t r| jdkrdS t| jS trb| jdkr0dS t| " td| j dW  5 Q R  S Q R X n*dd l}| 	 }|r|
|d pdS dS d S )Nr    z/proc/z/exe)r
   r   rf   Zproc_exer   r   osreadlinkshutilcmdlinewhich)r   r   r   rm   rm   rn   exe  s    


(zProcess.exec              
   C   s   t r| jdkrg S trzt| jW S  tk
r } zt|jtjkr| j| j| j	  }}}t
| jrpt||||t| jst||||td|d g  W Y S  W 5 d }~X Y qX nt| jS d S )Nr   z	ignoring z and returning an empty list)r   r   r   rf   Zproc_cmdliner   r   EINVALr   r   r   r   r   r   r   )r   r   r   rF   r.   rm   rm   rn   r     s     

zProcess.cmdlinec                 C   s   t | jS r   )rf   Zproc_environr   r   rm   rm   rn   environ  s    zProcess.environc                 C   s>   |   td  }t }z
|| W S  tk
r8   Y d S X d S )Nr6   )r   r   r   Zget_terminal_mapKeyError)r   Ztty_nrZtmaprm   rm   rn   terminal  s    
zProcess.terminalc                 C   s   |   td  | _| jS )Nr.   )r   r   r   r   rm   rm   rn   r.     s    zProcess.ppidc                 C   s.   |   }t|td  |td  |td  S )Nr0   r1   r2   )r   r   Zpuidsr   r   Zrawtuplerm   rm   rn   uids  s    


zProcess.uidsc                 C   s.   |   }t|td  |td  |td  S )Nr3   r4   r5   )r   r   Zpgidsr   r   rm   rm   rn   gids  s    


zProcess.gidsc                 C   s8   |   }t|td  |td  |td  |td  S )Nr<   r=   r>   r?   )r   r   r\   r   r   rm   rm   rn   rq     s    



zProcess.cpu_timesc                 C   s   |   td  S )NrE   )r   r   r   rm   rm   rn   cpu_num  s    zProcess.cpu_numc                 C   s@   |   }t|td  |td  |td  |td  |td  S )Nr@   rA   rB   rC   rD   )r   rX   r   r   rm   rm   rn   memory_info  s    




zProcess.memory_infoFc                 C   s$   |   td  }tr |s t|}|S )Nr7   )r   r   r   r   )r   	monotonicr   rm   rm   rn   r7     s    zProcess.create_timec                 C   s    t rt| jS t|  S d S r   )HAS_PROC_NUM_THREADSrf   r   r   r{   threadsr   rm   rm   rn   num_threads  s    zProcess.num_threadsc                 C   s$   |   }t|td  |td  S )Nr8   r9   )r   r   Zpctxswr   r   rm   rm   rn   num_ctx_switches  s
    

zProcess.num_ctx_switchesc                 C   sH   t | j}g }|D ]"\}}}t|||}|| qtrD|   |S r   )rf   Zproc_threadsr   r   Zpthreadrs   r   r   )r   r   r   Z	thread_idutimeZstimer   rm   rm   rn   r      s    zProcess.threadsinetc              	   C   s   t | \}}g }tr$t| j|}n&tr:t| j||}nt| j||}|D ]P}|d d \}}}	}
}}tr||ksN|	|krqNt|||	|
||t	}|
| qN|   |S )Nr   )r   r   rf   r   r   r   Zproc_net_connectionsr
   r   r   rs   r   )r   r   r   r   rt   r   ru   r   r   r   r   r   r/   r   rm   rm   rn   r   ,  s0          zProcess.net_connectionsNc                 C   s   t | j|| jS r   )r   Zwait_pidr   r   )r   timeoutrm   rm   rn   waitE  s    zProcess.waitc                 C   s   t | jS r   )r   getpriorityr   r   rm   rm   rn   nice_getI  s    zProcess.nice_getc                 C   s   t | j|S r   )r   setpriorityr   )r   valuerm   rm   rn   nice_setM  s    zProcess.nice_setc                 C   s   |   td  }t|dS )Nr/   ?)r   r   r   r   )r   coderm   rm   rn   r/   Q  s    zProcess.statusc                 C   s(   |   }t|td  |td  ddS )Nr:   r;   rx   )r   r   Zpior   r   rm   rm   rn   io_countersW  s    

zProcess.io_countersc                 C   s   t r| jdkrdS t| jS )z)Return process current working directory.r   r   )r   r   rf   Zproc_cwdr   rm   rm   rn   cwda  s    zProcess.cwdZmmapr`   rb   c                 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 rm   )r   Z	popenfile).0pathr   rm   rm   rn   
<listcomp>u  s     z&Process.open_files.<locals>.<listcomp>)rf   Zproc_open_filesr   )r   r   rm   rm   rn   
open_filesq  s    zProcess.open_filesc                 C   s   t | j}tr|   |S )z=Return the number of file descriptors opened by this process.)rf   Zproc_num_fdsr   r   r   r   rm   rm   rn   num_fdsw  s    zProcess.num_fdsc                 C   s   t | jS r   )rf   Zproc_cpu_affinity_getr   r   rm   rm   rn   cpu_affinity_get  s    zProcess.cpu_affinity_getc              
   C   s   t ttt }|D ]&}||krd|d| d}t|qzt| j| W nd tk
r } zF|j	t	j
t	jhkr|D ](}||krxd|d| d}t||qx W 5 d }~X Y nX d S )Nzinvalid CPU z (choose between ))r   r   r{   rr   r   rf   Zproc_cpu_affinity_setr   r   r   r   ZEDEADLK)r   ZcpusZallcpusr   msgr   rm   rm   rn   cpu_affinity_set  s    
zProcess.cpu_affinity_setc                 C   s   t | jS r   )rf   Zproc_memory_mapsr   r   rm   rm   rn   memory_maps  s    zProcess.memory_mapsc                 C   sR   |d krt | j|S t|dkr4d|}t||\}}t | j|||S d S )Nr   z2second argument must be a (soft, hard) tuple, got )rf   Zproc_getrlimitr   r{   r   Zproc_setrlimit)r   resourceZlimitsr  ZsoftZhardrm   rm   rn   rlimit  s    zProcess.rlimit)F)r   )N)N)-__name__
__module____qualname____doc__	__slots__r   r   r   r   r   r   r   rF   r   r   r   r   r.   r   r   rq   r
   r   r   Zmemory_full_infor7   r   r   r   r   r   r   r  r/   r  r  r   Znt_mmap_groupedZnt_mmap_extr	  r
  r  r  r  r  rm   rm   rm   rn   r   o  s   








	









	
  

	


r   )F)wr  
contextlibr   r   r   collectionsr   r   Z	xml.etreer   r   r   r   r   rf   r	   r   r
   r   r   r   r   r   r   r   r   r   r   r   Z__extra__all__ZSIDLZSTATUS_IDLEZSRUNZSTATUS_RUNNINGZSSLEEPZSTATUS_SLEEPINGZSSTOPZSTATUS_STOPPEDZSZOMBr   ZSWAITZSTATUS_WAITINGZSLOCKZSTATUS_LOCKEDr   ZSDEADZSTATUS_WAKINGZSONPROCZ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getpagesizeZPAGESIZEZAF_LINKr   r   dictr   rG   rR   rX   Zpfullmemr\   r_   ra   rc   ro   rp   rq   rr   rv   rw   r   r   r   
disk_usageZdisk_io_countersr   Znet_if_addrsr   r   r   r   r   r   	Exceptionr   r   r   r   r   r   r   r   contextmanagerr   r   rm   rm   rm   rn   <module>   s         	             
            
$ 
      
     
/

 






	

