B
    çÚ†\XL  ã               @   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gZeedƒZeedƒZeedƒZ e !d¡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Z-ej.ej/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jEiZFeGdddddddddZHdZIdZJdZKdZLedd d!gƒZMeMZNed"d#d$d%d&gƒZOed'd(d)d*d+d,gƒZPd-d.„ ZQd/d0„ ZRd1d2„ ZSd3d4„ ZTd5d6„ ZUd7d8„ ZVd9d:„ ZWd;d<„ ZXejYZYejZZZdQd>d?„Z[ej\Z\ertej]Z]dRdAdB„Z^dCdD„ Z_dEdF„ Z`dGdH„ ZadIdJ„ ZbdKdL„ ZcdMdN„ ZdG dOdP„ dPeeƒZfdS )SzAIX platform implementation.é    N)Ú
namedtuple)ÚAF_INETé   )Ú_common)Ú_psposix)Ú_psutil_aix)Ú_psutil_posix)ÚAF_INET6)Úmemoize_when_activated)ÚNIC_DUPLEX_FULL)ÚNIC_DUPLEX_HALF)ÚNIC_DUPLEX_UNKNOWN)Úsockfam_to_enum)Úsocktype_to_enum)Úusage_percent)ÚPY3ÚPROCFS_PATHÚproc_threadsÚnet_io_countersÚproc_io_countersÚSC_PAGE_SIZEé   é   é   é   é   é   )ÚppidÚrssÚvmsÚcreate_timeÚniceÚnum_threadsÚstatusÚttynrÚpmemr   r   Ú	scputimesÚuserÚsystemZidleZiowaitÚsvmemÚtotalZ	availableÚpercentÚusedÚfreec               C   s   t jd jS )z+Return updated psutil.PROCFS_PATH constant.Zpsutil)ÚsysÚmodulesr   © r0   r0   ú,lib/python3.7/site-packages/psutil/_psaix.pyÚget_procfs_pathm   s    r2   c              C   s4   t  ¡ \} }}}}t| | | dd}t| ||||ƒS )Nr   )Úround_)ÚcextZvirtual_memr   r)   )r*   Zavailr-   ZpinnedZinuser+   r0   r0   r1   Úvirtual_memoryw   s    r5   c              C   s:   t  ¡ \} }}}| | }t|| dd}t | |||||¡S )z=Swap system memory as a (total, used, free, sin, sout) tuple.r   )r3   )r4   Zswap_memr   r   Zsswap)r*   r-   ZsinZsoutr,   r+   r0   r0   r1   Úswap_memory}   s    r6   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 r0   )Úsum)Ú.0Úxr0   r0   r1   ú
<listcomp>   s    zcpu_times.<locals>.<listcomp>)r4   Úper_cpu_timesr&   Úzip)Úretr0   r0   r1   Ú	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 r0   )r&   )r8   r9   r0   r0   r1   r:   “   s    z!per_cpu_times.<locals>.<listcomp>)r4   r;   )r=   r0   r0   r1   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Ú
ValueErrorr0   r0   r0   r1   Úcpu_count_logical–   s    
rC   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 r0   )Údecoder.   rE   Úencoding)r8   r9   r0   r0   r1   r:   ¥   s   z&cpu_count_physical.<locals>.<listcomp>r   z%r command error
%s)
Ú
subprocessÚPopenÚPIPEÚcommunicater   Ú
returncodeÚRuntimeErrorÚstripÚ
splitlinesÚlen)ÚcmdÚprE   rF   Z
processorsr0   r0   r1   Úcpu_count_physicalŸ   s    

rT   c              C   s    t  ¡ \} }}}t | |||¡S )z*Return various CPU stats as a named tuple.)r4   Ú	cpu_statsr   Z	scpustats)Zctx_switchesZ
interruptsZsoft_interruptsZsyscallsr0   r0   r1   rU   ­   s    rU   Fc       	      C   s`   g }t  ¡ }xN|D ]F}|\}}}}|dkr.d}| s>t|ƒjs>qt ||||¡}| |¡ qW |S )zReturn system disk partitions.ZnoneÚ )r4   Údisk_partitionsÚ
disk_usager*   r   Z	sdiskpartÚappend)	ÚallÚretlistZ
partitionsÚ	partitionZdeviceZ
mountpointZfstypeZoptsÚntupler0   r0   r1   rW   ½   s    

rW   éÿÿÿÿc          
   C   s  t j}| |kr.td| d dd„ |D ƒ¡f ƒ‚t j|  \}}t |¡}tƒ }x°|D ]¨}|\}}	}
}}}}|	|krrqR|
|kr|qRt| }|	tt	fkr¬|ržt j
|Ž }|r¬t j
|Ž }t|	ƒ}	t|
ƒ}
|dkrÜt  ||	|
||||¡}nt  ||	|
|||¡}| |¡ qRW t|ƒ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 r0   )Úrepr)r8   r9   r0   r0   r1   r:   ä   s    z#net_connections.<locals>.<listcomp>r^   )r   Z	conn_tmaprB   Újoinr4   Únet_connectionsÚsetÚTCP_STATUSESr   r	   Zaddrr   r   ZsconnZpconnÚaddÚlist)ÚkindÚ_pidZcmapZfamiliesÚtypesÚrawlistr=   ÚitemÚfdZfamZtype_ZladdrZraddrr#   ÚpidÚntr0   r0   r1   ra   Ý   s4    



ra   c              C   sà   t tdœ} tdd„ tƒ D ƒƒ}i }x¸|D ]°}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¡}|  |t¡}t ||||¡||< q(W |S )z)Get NIC stats (isup, duplex, speed, mtu).)ZFullZHalfc             S   s   g | ]}|d  ‘qS )r   r0   )r8   r9   r0   r0   r1   r:     s    z net_if_stats.<locals>.<listcomp>rV   r   z/usr/bin/entstatz-d)rE   rF   c             S   s   g | ]}|  tjj¡‘qS r0   )rG   r.   rE   rH   )r8   r9   r0   r0   r1   r:     s   z"Running: (\d+) Mbps.*?(\w+) DuplexNr   r   )r   r   rb   Únet_if_addrsr4   Únet_if_statsrI   rJ   rK   rL   r   rM   ÚreÚsearchÚintÚgroupÚgetr   r   Z	snicstats)Z
duplex_mapÚnamesr=   ÚnameZisupZmtuZduplexZspeedrS   rE   rF   Z	re_resultr0   r0   r1   ro   þ   s.    


ro   c               C   s   t  ¡ S )z:The system boot time expressed in seconds since the epoch.)r4   Ú	boot_timer0   r0   r0   r1   rw   #  s    rw   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)r4   Úusersr   ZsuserrY   )r[   ri   rx   rj   r'   ZttyZhostnameZtstampZuser_processrl   rm   r0   r0   r1   ry   (  s    
ry   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 r0   )Úisdigitrr   )r8   r9   r0   r0   r1   r:   B  s    zpids.<locals>.<listcomp>)r@   Úlistdirr2   r0   r0   r0   r1   Ú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Úexistsr`   r2   Ústr)rl   r0   r0   r1   Ú
pid_existsE  s    r€   c                s   ‡ fdd„}|S )zƒCall callable into a try/except clause and translate ENOENT,
    EACCES and EPERM in NoSuchProcess or AccessDenied exceptions.
    c          
      s²   yˆ | f|ž|ŽS  t k
r¬ } z~td ks:td ks:td kr<‚ |jtjtjfkrzt| jƒsht| j| j	ƒ‚nt| j| j	| j
ƒ‚|jtjtjfkršt| j| j	ƒ‚‚ W d d }~X Y nX d S )N)ÚEnvironmentErrorÚNoSuchProcessÚAccessDeniedÚZombieProcessÚerrnoÚENOENTZESRCHr€   rl   Ú_nameÚ_ppidZEPERMZEACCES)ÚselfÚargsÚkwargsÚerr)Úfunr0   r1   ÚwrapperO  s    
z wrap_exceptions.<locals>.wrapperr0   )r   rŽ   r0   )r   r1   Úwrap_exceptionsJ  s    r   c               @   s|  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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$rxed?d@„ ƒZ%d<S )CÚProcessz1Wrapper class around underlying C implementation.rl   r‡   rˆ   Ú_procfs_pathÚ_cachec             C   s   || _ d | _d | _tƒ | _d S )N)rl   r‡   rˆ   r2   r‘   )r‰   rl   r0   r0   r1   Ú__init__j  s    zProcess.__init__c             C   s(   | j  | ¡ | j | ¡ | j | ¡ d S )N)Ú_proc_name_and_argsZcache_activateÚ_proc_basic_infoÚ
_proc_cred)r‰   r0   r0   r1   Úoneshot_enterp  s    zProcess.oneshot_enterc             C   s(   | j  | ¡ | j | ¡ | j | ¡ d S )N)r”   Zcache_deactivater•   r–   )r‰   r0   r0   r1   Úoneshot_exitu  s    zProcess.oneshot_exitc             C   s   t  | j| j¡S )N)r4   Zproc_name_and_argsrl   r‘   )r‰   r0   r0   r1   r”   z  s    zProcess._proc_name_and_argsc             C   s   t  | j| j¡S )N)r4   Zproc_basic_inforl   r‘   )r‰   r0   r0   r1   r•     s    zProcess._proc_basic_infoc             C   s   t  | j| j¡S )N)r4   Z	proc_credrl   r‘   )r‰   r0   r0   r1   r–   „  s    zProcess._proc_credc             C   s    | j dkrdS |  ¡ d  d¡S )Nr   Zswapperú )rl   r”   Úrstrip)r‰   r0   r0   r1   rv   ‰  s    
zProcess.namec             C   sÆ   |   ¡ d }tjj|krttj |¡s>tj tj |  ¡ |¡¡}tj |¡rhtj |¡rht 	|tj
¡rh|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 )Nr   ÚPATHú:rV   )Úcmdliner@   r}   ÚsepÚisabsÚabspathr`   ÚcwdÚisfileÚaccessÚX_OKÚbasenameÚenvironÚsplit)r‰   Úexer}   Zpossible_exer0   r0   r1   r¨     s    zProcess.exec             C   s   |   ¡ d  d¡S )Nr   ú )r”   r§   )r‰   r0   r0   r1   r   ¨  s    zProcess.cmdlinec             C   s   |   ¡ td  S )Nr    )r•   Úproc_info_map)r‰   r0   r0   r1   r    ¬  s    zProcess.create_timec             C   s   |   ¡ td  S )Nr"   )r•   rª   )r‰   r0   r0   r1   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)	r4   r   rl   r   ZpthreadrY   r@   Ústatr‘   )r‰   ri   r[   Z	thread_idÚutimeZstimer]   r0   r0   r1   Úthreadsµ  s    zProcess.threadsÚinetc             C   s,   t || jd}|s(t d| j| jf ¡ |S )N)rg   z%s/%s)ra   rl   r@   r«   r‘   )r‰   rf   r=   r0   r0   r1   ÚconnectionsÆ  s    zProcess.connectionsc             C   s   t  | j¡S )N)Ú
cext_posixÚgetpriorityrl   )r‰   r0   r0   r1   Únice_getÓ  s    zProcess.nice_getc             C   s   t  | j|¡S )N)r°   Úsetpriorityrl   )r‰   Úvaluer0   r0   r1   Únice_set×  s    zProcess.nice_setc             C   s   |   ¡ td  | _| jS )Nr   )r•   rª   rˆ   )r‰   r0   r0   r1   r   Û  s    zProcess.ppidc             C   s"   |   ¡ \}}}}}}t |||¡S )N)r–   r   Úpuids)r‰   ÚrealÚ	effectiveÚsavedÚ_r0   r0   r1   Úuidsà  s    zProcess.uidsc             C   s"   |   ¡ \}}}}}}t |||¡S )N)r–   r   r¶   )r‰   rº   r·   r¸   r¹   r0   r0   r1   Úgidså  s    zProcess.gidsc             C   s   t  | j| j¡}tj|Ž S )N)r4   Zproc_cpu_timesrl   r‘   r   Z	pcputimes)r‰   r>   r0   r0   r1   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devr0   r0   r1   Úterminalï  s    zProcess.terminalc          
   C   sr   | j }yt d|| jf ¡}| d¡S  tk
rl } z*|jtjkrZt d|| jf ¡ d S ‚ W d d }~X Y nX d S )Nz	%s/%s/cwdú/z%s/%s)	r‘   r@   Úreadlinkrl   rš   ÚOSErrorr…   r†   r«   )r‰   Zprocfs_pathÚresultrŒ   r0   r0   r1   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   r0   r0   r1   Úmemory_info  s    zProcess.memory_infoc             C   s   |   ¡ td  }t |d¡S )Nr#   ú?)r•   rª   ÚPROC_STATUSESrt   )r‰   Úcoder0   r0   r1   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)rE   rF   c             S   s   g | ]}|  tjj¡‘qS r0   )rG   r.   rE   rH   )r8   r9   r0   r0   r1   r:     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   rl   rK   rL   r   Úlowerr‚   r‡   rp   ÚfindallrO   Ú
startswithrY   r   Z	popenfilerr   )r‰   rS   rE   rF   Z	procfilesr[   rk   r}   r0   r0   r1   Ú
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)rl   rQ   r@   r{   r‘   )r‰   r0   r0   r1   Únum_fds+  s    
zProcess.num_fdsc             C   s   t jt | j¡Ž S )N)r   Zpctxswr4   Zproc_num_ctx_switchesrl   )r‰   r0   r0   r1   Únum_ctx_switches1  s    zProcess.num_ctx_switchesNc             C   s   t  | j|| j¡S )N)r   Zwait_pidrl   r‡   )r‰   Ztimeoutr0   r0   r1   Úwait6  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)	r4   r   rl   rÃ   r€   r‚   r‡   r   Zpio)r‰   ZrcZwcÚrbÚwbr0   r0   r1   Úio_counters;  s    
zProcess.io_counters)r®   )N)&Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r“   r—   r˜   r   r
   r”   r•   r–   rv   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Ò   r0   r0   r0   r1   r   e  sL   r   )F)r^   )grÖ   r…   r¾   r@   rp   rI   r.   Úcollectionsr   Zsocketr   rV   r   r   r   r4   r   r°   r	   r
   r   r   r   r   r   r   Z_compatr   Z__extra__all__ÚhasattrrØ   ZHAS_NET_IO_COUNTERSrÙ   rA   Z	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‚   r„   rƒ   ZTimeoutExpiredr%   Zpfullmemr&   r)   r2   r5   r6   r>   r;   rC   rT   rU   Zdisk_io_countersrX   rW   rn   r   ra   ro   rw   ry   r|   r€   r   Úobjectr   r0   r0   r0   r1   Ú<module>   s¦   



	
	

!%