B
    "„OcûH  ã               @   sØ  d Z ddlZddl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 dgZe edƒZ!e edƒZ"e edƒ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/iZ0e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jGe
jHiZIeJdddddddd d!ZKed"d#d$gƒZLeLZMed%d&d'd(d)gƒZNed*d+d,d-d.d/gƒZOd0d1„ ZPd2d3„ ZQd4d5„ ZRd6d7„ ZSd8d9„ ZTd:d;„ ZUd<d=„ ZVejWZWejXZXdRd?d@„ZYejZZZe"rŠej[Z[dSdBdC„Z\dDdE„ Z]dFdG„ Z^dHdI„ Z_dJdK„ Z`dLdM„ ZadNdO„ ZbG dPdQ„ dQecƒZddS )TzAIX platform implementation.é    N)Ú
namedtupleé   )Ú_common)Ú_psposix)Ú_psutil_aix)Ú_psutil_posix)ÚNIC_DUPLEX_FULL)ÚNIC_DUPLEX_HALF)ÚNIC_DUPLEX_UNKNOWN)ÚAccessDenied)ÚNoSuchProcess)ÚZombieProcess)Úconn_to_ntuple)Úget_procfs_path)Úmemoize_when_activated)Úusage_percent)ÚPY3)ÚFileNotFoundError)ÚPermissionError)ÚProcessLookupErrorZPROCFS_PATHÚproc_threadsÚnet_io_countersÚproc_io_countersé   é   é   é   é   é   )ÚppidÚrssÚvmsÚcreate_timeÚniceÚnum_threadsÚstatusÚttynrÚpmemr    r!   Ú	scputimesÚuserÚsystemZidleZiowaitÚsvmemÚtotalZ	availableÚpercentÚusedÚfreec              C   s4   t  ¡ \} }}}}t| | | dd}t| ||||ƒS )Nr   )Úround_)ÚcextZvirtual_memr   r+   )r,   Zavailr/   ZpinnedZinuser-   © r2   ú,lib/python3.7/site-packages/psutil/_psaix.pyÚvirtual_memoryj   s    r4   c              C   s:   t  ¡ \} }}}| | }t|| dd}t | |||||¡S )z=Swap system memory as a (total, used, free, sin, sout) tuple.r   )r0   )r1   Zswap_memr   r   Zsswap)r,   r/   ZsinZsoutr.   r-   r2   r2   r3   Úswap_memoryp   s    r5   c              C   s   t  ¡ } tdd„ t| Ž D ƒŽ S )z-Return system-wide CPU times as a named tuplec             S   s   g | ]}t |ƒ‘qS r2   )Úsum)Ú.0Úxr2   r2   r3   ú
<listcomp>€   s    zcpu_times.<locals>.<listcomp>)r1   Úper_cpu_timesr(   Úzip)Úretr2   r2   r3   Ú	cpu_times}   s    r=   c              C   s   t  ¡ } dd„ | D ƒS )z5Return system per-CPU times as a list of named tuplesc             S   s   g | ]}t |Ž ‘qS r2   )r(   )r7   r8   r2   r2   r3   r9   †   s    z!per_cpu_times.<locals>.<listcomp>)r1   r:   )r<   r2   r2   r3   r:   ƒ   s    r:   c               C   s$   y
t  d¡S  tk
r   dS X dS )z0Return the number of logical CPUs in the system.ÚSC_NPROCESSORS_ONLNN)ÚosÚsysconfÚ
ValueErrorr2   r2   r2   r3   Úcpu_count_logical‰   s    
rB   c              C   sr   d} t j| dt jt jd}| ¡ \}}tr@dd„ ||fD ƒ\}}|jdkrZtd| |f ƒ‚| ¡  ¡ }t	|ƒppd S )Nzlsdev -Cc processorT)ÚshellÚstdoutÚstderrc             S   s   g | ]}|  tjj¡‘qS r2   )ÚdecodeÚsysrD   Úencoding)r7   r8   r2   r2   r3   r9   ˜   s   z#cpu_count_cores.<locals>.<listcomp>r   z%r command error
%s)
Ú
subprocessÚPopenÚPIPEÚcommunicater   Ú
returncodeÚRuntimeErrorÚstripÚ
splitlinesÚlen)ÚcmdÚprD   rE   Z
processorsr2   r2   r3   Úcpu_count_cores’   s    

rT   c              C   s    t  ¡ \} }}}t | |||¡S )z*Return various CPU stats as a named tuple.)r1   Ú	cpu_statsr   Z	scpustats)Zctx_switchesZ
interruptsZsoft_interruptsZsyscallsr2   r2   r3   rU       s    rU   Fc          	   C   sl   g }t  ¡ }xZ|D ]R}|\}}}}|dkr.d}| s>t|ƒjs>qd }}	t ||||||	¡}
| |
¡ qW |S )zReturn system disk partitions.ZnoneÚ N)r1   Údisk_partitionsÚ
disk_usager,   r   Z	sdiskpartÚappend)ÚallÚretlistZ
partitionsÚ	partitionZdeviceZ
mountpointZfstypeZoptsZmaxfileZmaxpathÚntupler2   r2   r3   rW   °   s    

rW   éÿÿÿÿc             C   s°   t j}| |kr.td| d dd„ |D ƒ¡f ƒ‚t j|  \}}t |¡}g }x`|D ]X}|\}}	}
}}}}|	|krpqP|
|krzqPt||	|
|||t|dkr–|ndd}| |¡ qPW |S )zˆReturn socket connections.  If pid == -1 return system-wide
    connections (as opposed to connections opened by one process only).
    z+invalid %r kind argument; choose between %sz, c             S   s   g | ]}t |ƒ‘qS r2   )Úrepr)r7   r8   r2   r2   r3   r9   Ù   s    z#net_connections.<locals>.<listcomp>r^   N)Úpid)	r   Z	conn_tmaprA   Újoinr1   Únet_connectionsr   ÚTCP_STATUSESrY   )ÚkindÚ_pidZcmapZfamiliesÚtypesÚrawlistr<   ÚitemÚfdZfamZtype_ZladdrZraddrr%   r`   Úntr2   r2   r3   rb   Ò   s"    

rb   c              C   sú   t tdœ} tdd„ tƒ D ƒƒ}i }xÒ|D ]Ê}t |¡}t |¡}d}d}tjdd|gtj	tj	d}| 
¡ \}	}
trˆd	d„ |	|
fD ƒ\}	}
|jdkr¾t d
|	¡}|dk	r¾t| d¡ƒ}| d¡}d |¡}d|k}|  |t¡}t |||||¡||< q(W |S )z)Get NIC stats (isup, duplex, speed, mtu).)ZFullZHalfc             S   s   g | ]}|d  ‘qS )r   r2   )r7   r8   r2   r2   r3   r9   í   s    z net_if_stats.<locals>.<listcomp>rV   r   z/usr/bin/entstatz-d)rD   rE   c             S   s   g | ]}|  tjj¡‘qS r2   )rF   rG   rD   rH   )r7   r8   r2   r2   r3   r9   ü   s   z"Running: (\d+) Mbps.*?(\w+) DuplexNr   r   ú,Zrunning)r   r	   ÚsetÚnet_if_addrsÚ
cext_posixZ
net_if_mtuZnet_if_flagsrI   rJ   rK   rL   r   rM   ÚreÚsearchÚintÚgroupra   Úgetr
   r   Z	snicstats)Z
duplex_mapÚnamesr<   ÚnameZmtuÚflagsZduplexZspeedrS   rD   rE   Z	re_resultZoutput_flagsZisupr2   r2   r3   Únet_if_statsé   s4    





rw   c               C   s   t  ¡ S )z:The system boot time expressed in seconds since the epoch.)r1   Ú	boot_timer2   r2   r2   r3   rx     s    rx   c              C   s`   g } t  ¡ }d}xJ|D ]B}|\}}}}}}	|s0q||kr<d}t |||||	¡}
|  |
¡ qW | S )z:Return currently connected users as a list of namedtuples.)z:0.0z:0Ú	localhost)r1   Úusersr   ZsuserrY   )r[   rg   ry   rh   r)   ZttyZhostnameZtstampZuser_processr`   rj   r2   r2   r3   rz     s    
rz   c               C   s   dd„ t  tƒ ¡D ƒS )z7Returns a list of PIDs currently running on the system.c             S   s   g | ]}|  ¡ rt|ƒ‘qS r2   )Úisdigitrq   )r7   r8   r2   r2   r3   r9   0  s    zpids.<locals>.<listcomp>)r?   Úlistdirr   r2   r2   r2   r3   Úpids.  s    r}   c             C   s   t j t j tƒ t| ƒd¡¡S )z&Check for the existence of a unix pid.Zpsinfo)r?   ÚpathÚexistsra   r   Ústr)r`   r2   r2   r3   Ú
pid_exists3  s    r   c                s   t  ˆ ¡‡ fdd„ƒ}|S )zƒCall callable into a try/except clause and translate ENOENT,
    EACCES and EPERM in NoSuchProcess or AccessDenied exceptions.
    c          	      sz   yˆ | f|ž|ŽS  t tfk
rT   t| jƒs>t| j| jƒ‚nt| j| j| jƒ‚Y n" tk
rt   t	| j| jƒ‚Y nX d S )N)
r   r   r   r`   r   Ú_namer   Ú_ppidr   r   )ÚselfÚargsÚkwargs)Úfunr2   r3   Úwrapper<  s    
z wrap_exceptions.<locals>.wrapper)Ú	functoolsÚwraps)r‡   rˆ   r2   )r‡   r3   Úwrap_exceptions8  s    r‹   c               @   sx  e Zd ZdZdddddgZdd„ Zd	d
„ Zdd„ Zee	dd„ ƒƒZ
e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rªedd„ ƒZedAd 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d0d1„ ƒZed2d3„ ƒZeZed4d5„ ƒZd6d7„ Z ed8d9„ ƒZ!ed:d;„ ƒZ"edBd=d>„ƒZ#e$rted?d@„ ƒZ%d<S )CÚProcessz1Wrapper class around underlying C implementation.r`   r‚   rƒ   Ú_procfs_pathÚ_cachec             C   s   || _ d | _d | _tƒ | _d S )N)r`   r‚   rƒ   r   r   )r„   r`   r2   r2   r3   Ú__init__R  s    zProcess.__init__c             C   s   | j  | ¡ | j | ¡ d S )N)Ú_proc_basic_infoZcache_activateÚ
_proc_cred)r„   r2   r2   r3   Úoneshot_enterX  s    zProcess.oneshot_enterc             C   s   | j  | ¡ | j | ¡ d S )N)r   Zcache_deactivater‘   )r„   r2   r2   r3   Úoneshot_exit\  s    zProcess.oneshot_exitc             C   s   t  | j| j¡S )N)r1   Zproc_basic_infor`   r   )r„   r2   r2   r3   r   `  s    zProcess._proc_basic_infoc             C   s   t  | j| j¡S )N)r1   Z	proc_credr`   r   )r„   r2   r2   r3   r‘   e  s    zProcess._proc_credc             C   s$   | j dkrdS t | j | j¡ d¡S )Nr   Zswapperú )r`   r1   Z	proc_namer   Úrstrip)r„   r2   r2   r3   ru   j  s    
zProcess.namec             C   sÒ   |   ¡ }|sdS |d }tjj|kr€tj |¡sJtj tj |  ¡ |¡¡}tj |¡rttj |¡rtt 	|tj
¡rt|S tj |¡}xLtjd  d¡D ]8}tj tj ||¡¡}tj |¡r’t 	|tj
¡r’|S q’W dS )NrV   r   ÚPATHú:)Úcmdliner?   r~   ÚsepÚisabsÚabspathra   ÚcwdÚisfileÚaccessÚX_OKÚbasenameÚenvironÚsplit)r„   r˜   Úexer~   Zpossible_exer2   r2   r3   r£   q  s$    zProcess.exec             C   s   t  | j¡S )N)r1   Z	proc_argsr`   )r„   r2   r2   r3   r˜   Œ  s    zProcess.cmdlinec             C   s   t  | j¡S )N)r1   Zproc_environr`   )r„   r2   r2   r3   r¡     s    zProcess.environc             C   s   |   ¡ td  S )Nr"   )r   Úproc_info_map)r„   r2   r2   r3   r"   ”  s    zProcess.create_timec             C   s   |   ¡ td  S )Nr$   )r   r¤   )r„   r2   r2   r3   r$   ˜  s    zProcess.num_threadsc             C   sZ   t  | j¡}g }x*|D ]"\}}}t |||¡}| |¡ qW |sVt d| j| jf ¡ |S )Nz%s/%s)	r1   r   r`   r   ZpthreadrY   r?   Ústatr   )r„   rg   r[   Z	thread_idÚutimeZstimer]   r2   r2   r3   Úthreads  s    zProcess.threadsÚinetc             C   s,   t || jd}|s(t d| j| jf ¡ |S )N)re   z%s/%s)rb   r`   r?   r¥   r   )r„   rd   r<   r2   r2   r3   Úconnections®  s    zProcess.connectionsc             C   s   t  | j¡S )N)rn   Úgetpriorityr`   )r„   r2   r2   r3   Únice_get»  s    zProcess.nice_getc             C   s   t  | j|¡S )N)rn   Úsetpriorityr`   )r„   Úvaluer2   r2   r3   Únice_set¿  s    zProcess.nice_setc             C   s   |   ¡ td  | _| jS )Nr   )r   r¤   rƒ   )r„   r2   r2   r3   r   Ã  s    zProcess.ppidc             C   s"   |   ¡ \}}}}}}t |||¡S )N)r‘   r   Úpuids)r„   ÚrealÚ	effectiveÚsavedÚ_r2   r2   r3   ÚuidsÈ  s    zProcess.uidsc             C   s"   |   ¡ \}}}}}}t |||¡S )N)r‘   r   r¯   )r„   r³   r°   r±   r²   r2   r2   r3   ÚgidsÍ  s    zProcess.gidsc             C   s   t  | j| j¡}tj|Ž S )N)r1   Zproc_cpu_timesr`   r   r   Z	pcputimes)r„   r=   r2   r2   r3   r=   Ò  s    zProcess.cpu_timesc             C   sP   |   ¡ td  }|d@ d? |d@ B }x&t d¡D ]}t |¡j|kr0|S q0W d S )Nr&   l       ü é   iÿÿ  z	/dev/**/*)r   r¤   Úglobr?   r¥   Úst_rdev)r„   ZttydevZdevr2   r2   r3   Úterminal×  s    zProcess.terminalc             C   sR   | j }yt d|| jf ¡}| d¡S  tk
rL   t d|| jf ¡ d S X d S )Nz	%s/%s/cwdú/z%s/%s)r   r?   Úreadlinkr`   r•   r   r¥   )r„   Zprocfs_pathÚresultr2   r2   r3   rœ   â  s    
zProcess.cwdc             C   s2   |   ¡ }|td  d }|td  d }t||ƒS )Nr    i   r!   )r   r¤   r'   )r„   r<   r    r!   r2   r2   r3   Úmemory_infoì  s    zProcess.memory_infoc             C   s   |   ¡ td  }t |d¡S )Nr%   ú?)r   r¤   ÚPROC_STATUSESrs   )r„   Úcoder2   r2   r3   r%   õ  s    zProcess.statusc             C   sÈ   t jddt| jƒgt jt jd}| ¡ \}}trFdd„ ||fD ƒ\}}d| ¡ kr`t| j| j	ƒ‚t
 d|¡}g }xR|D ]J\}}| ¡ }| d¡rœ|d	d … }| ¡ d
krªqv| t |t|ƒ¡¡ qvW |S )Nz/usr/bin/procfilesz-n)rD   rE   c             S   s   g | ]}|  tjj¡‘qS r2   )rF   rG   rD   rH   )r7   r8   r2   r2   r3   r9     s   z&Process.open_files.<locals>.<listcomp>zno such processz (\d+): S_IFREG.*\s*.*name:(.*)\nz//r   zcannot be retrieved)rI   rJ   r€   r`   rK   rL   r   Úlowerr   r‚   ro   ÚfindallrO   Ú
startswithrY   r   Z	popenfilerq   )r„   rS   rD   rE   Z	procfilesr[   ri   r~   r2   r2   r3   Ú
open_filesû  s$    
zProcess.open_filesc             C   s(   | j dkrdS tt d| j| j f ¡ƒS )Nr   z%s/%s/fd)r`   rQ   r?   r|   r   )r„   r2   r2   r3   Únum_fds  s    
zProcess.num_fdsc             C   s   t jt | j¡Ž S )N)r   Zpctxswr1   Zproc_num_ctx_switchesr`   )r„   r2   r2   r3   Únum_ctx_switches  s    zProcess.num_ctx_switchesNc             C   s   t  | j|| j¡S )N)r   Zwait_pidr`   r‚   )r„   Ztimeoutr2   r2   r3   Úwait  s    zProcess.waitc             C   sX   yt  | j¡\}}}}W n. tk
rF   t| jƒs@t| j| jƒ‚‚ Y nX t ||||¡S )N)	r1   r   r`   ÚOSErrorr   r   r‚   r   Zpio)r„   ZrcZwcÚrbÚwbr2   r2   r3   Úio_counters!  s    
zProcess.io_counters)r¨   )N)&Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r   r’   r“   r‹   r   r   r‘   ru   r£   r˜   r¡   r"   r$   ÚHAS_THREADSr§   r©   r«   r®   r   r´   rµ   r=   r¹   rœ   r½   Zmemory_full_infor%   rÄ   rÅ   rÆ   rÇ   ÚHAS_PROC_IO_COUNTERSrË   r2   r2   r2   r3   rŒ   M  sJ   
rŒ   )F)r^   )erÏ   r‰   r·   r?   ro   rI   rG   Úcollectionsr   rV   r   r   r   r1   r   rn   r   r	   r
   r   r   r   r   r   r   r   Z_compatr   r   r   r   Z__extra__all__ÚhasattrrÑ   ZHAS_NET_IO_COUNTERSrÒ   ZgetpagesizeZ	PAGE_SIZEZAF_LINKZSIDLZSTATUS_IDLEZSZOMBZSTATUS_ZOMBIEZSACTIVEZSTATUS_RUNNINGZSSWAPZSSTOPZSTATUS_STOPPEDr¿   ZTCPS_ESTABLISHEDZCONN_ESTABLISHEDZTCPS_SYN_SENTZCONN_SYN_SENTZTCPS_SYN_RCVDZ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_NONErc   Údictr¤   r'   Zpfullmemr(   r+   r4   r5   r=   r:   rB   rT   rU   Zdisk_io_countersrX   rW   rm   r   rb   rw   rx   rz   r}   r   r‹   ÚobjectrŒ   r2   r2   r2   r3   Ú<module>   s¤   


		

(