B
    çÚ†\—c  ã               @   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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dgZe d¡ZejZejdkZdZd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-iZ.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jEe
jFejGeejHe iZIeJdddddddddd d!d"d#ZKdZLdZMdZNdZOed$d%d&d'd(gƒZPed)d%d&d*d+gƒZQed,d-d.d/d0d1gƒZRed2d3d4gƒZSeSZTed5d6d3d7d8gƒZUed9d:d; VeUjW¡ ƒZXd<d=„ ZYd>d?„ ZZd@dA„ Z[dBdC„ Z\dDdE„ Z]dFdG„ Z^dHdI„ Z_dJdK„ Z`ejaZaejbZbd`dMdN„ZcejdZdejeZedadPdQ„ZfdRdS„ ZgdTdU„ ZhdVdW„ ZidXdY„ ZjdZd[„ Zkd\d]„ ZlG d^d_„ d_emƒZndS )bz'Sun OS Solaris platform implementation.é    N)Ú
namedtuple)ÚAF_INETé   )Ú_common)Ú_psposix)Ú_psutil_posix)Ú_psutil_sunos)ÚAF_INET6)Úisfile_strict)Úmemoize_when_activated)Úsockfam_to_enum)Úsocktype_to_enum)Úusage_percent)Úb)ÚPY3Ú	CONN_IDLEÚ
CONN_BOUNDÚPROCFS_PATHÚSC_PAGE_SIZEl        ZIDLEZBOUNDé   é   é   é   é   é   é   é	   é
   é   )ÚppidÚrssÚvmsÚcreate_timeÚniceÚnum_threadsÚstatusÚttynrÚuidÚeuidÚgidÚegidÚ	scputimesÚuserÚsystemZidleZiowaitÚ	pcputimesÚchildren_userÚchildren_systemÚsvmemÚtotalZ	availableÚpercentÚusedÚfreeÚpmemr    r!   Úpmmap_groupedÚpathZ	anonymousÚlockedÚ	pmmap_extzaddr perms ú c               C   s   t jd jS )z+Return updated psutil.PROCFS_PATH constant.Zpsutil)ÚsysÚmodulesr   © r>   r>   ú.lib/python3.7/site-packages/psutil/_pssunos.pyÚget_procfs_pathy   s    r@   c              C   sF   t  d¡t } t  d¡t  }}| | }t|| dd}t| ||||ƒS )zReport virtual memory metrics.ÚSC_PHYS_PAGESÚSC_AVPHYS_PAGESr   )Úround_)ÚosÚsysconfÚ	PAGE_SIZEr   r1   )r2   r5   Zavailr4   r3   r>   r>   r?   Úvirtual_memoryƒ   s
    rG   c           	   C   s  t  ¡ \} }tjddtjd  ddgtjd}| ¡ \}}trL| 	t
jj¡}|jdkrdtd|j ƒ‚| ¡  d	¡d
d… }|s†tdƒ‚d }}xL|D ]D}| ¡ }|dd… \}	}
|tt|	ƒd ƒ7 }|tt|
ƒd ƒ7 }q”W || }t||d
d}t ||||| t |t ¡S )zReport swap memory metrics.z/usr/bin/envzPATH=/usr/sbin:/sbin:%sÚPATHZswapz-l)Ústdoutr   z'swap -l' failed (retcode=%s)Ú
r   Nzno swap device(s) configuredéþÿÿÿi   )rC   )ÚcextZswap_memÚ
subprocessÚPopenrD   ÚenvironÚPIPEÚcommunicater   Údecoder<   rI   ÚencodingÚ
returncodeÚRuntimeErrorÚstripÚsplitÚintr   r   ZsswaprF   )ZsinZsoutÚprI   ÚstderrÚlinesr2   r5   ÚlineÚtÚfr4   r3   r>   r>   r?   Úswap_memoryŽ   s,    


r_   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 r>   )Úsum)Ú.0Úxr>   r>   r?   ú
<listcomp>·   s    zcpu_times.<locals>.<listcomp>)rL   Úper_cpu_timesr+   Úzip)Úretr>   r>   r?   Ú	cpu_times´   s    rg   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 r>   )r+   )ra   rb   r>   r>   r?   rc   ½   s    z!per_cpu_times.<locals>.<listcomp>)rL   rd   )rf   r>   r>   r?   rd   º   s    rd   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)rD   rE   Ú
ValueErrorr>   r>   r>   r?   Úcpu_count_logicalÀ   s    
rj   c               C   s   t  ¡ S )z1Return the number of physical CPUs in the system.)rL   Zcpu_count_physr>   r>   r>   r?   Úcpu_count_physicalÉ   s    rk   c              C   s$   t  ¡ \} }}}d}t | |||¡S )z*Return various CPU stats as a named tuple.r   )rL   Ú	cpu_statsr   Z	scpustats)Zctx_switchesZ
interruptsZsyscallsZtrapsZsoft_interruptsr>   r>   r?   rl   Î   s    
rl   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Ú )rL   Údisk_partitionsÚ
disk_usager2   r   Z	sdiskpartÚappend)	ÚallÚretlistZ
partitionsÚ	partitionZdeviceZ
mountpointZfstypeZoptsZntupler>   r>   r?   rn   ß   s    

rn   éÿÿÿÿc          
   C   s  t j ¡ }|dkr| dd¡ | |krFtd| d dd„ |D ƒ¡f ƒ‚t j|  \}}t |¡}tƒ }x°|D ]¨}|\}}	}
}}}}|	|krŠqj|
|kr”qj|	t	t
fkr¼|r®t j|Ž }|r¼t j|Ž }t| }t|	ƒ}	t|
ƒ}
|dkrôt  ||	|
||||¡}nt  ||	|
|||¡}| |¡ qjW t|ƒS )z»Return socket connections.  If pid == -1 return system-wide
    connections (as opposed to connections opened by one process only).
    Only INET sockets are returned (UNIX are not).
    rt   Úunixr   z+invalid %r kind argument; choose between %sz, c             S   s   g | ]}t |ƒ‘qS r>   )Úrepr)ra   rb   r>   r>   r?   rc     s    z#net_connections.<locals>.<listcomp>)r   Z	conn_tmapÚcopyÚpopri   ÚjoinrL   Únet_connectionsÚsetr   r	   ÚaddrÚTCP_STATUSESr   r   ZsconnÚpconnÚaddÚlist)ÚkindÚ_pidZcmapZfamiliesÚtypesÚrawlistrf   ÚitemÚfdZfamZtype_ZladdrZraddrr%   ÚpidÚntr>   r>   r?   rz   ý   s8    




rz   c              C   sV   t  ¡ } xH|  ¡ D ]<\}}|\}}}}ttdƒr:t |¡}t ||||¡| |< qW | S )z)Get NIC stats (isup, duplex, speed, mtu).Ú	NicDuplex)rL   Únet_if_statsÚitemsÚhasattrr   r‰   Z	snicstats)rf   Únamer‹   ZisupZduplexZspeedZmtur>   r>   r?   rŠ   !  s    

rŠ   c               C   s   t  ¡ S )z:The system boot time expressed in seconds since the epoch.)rL   Ú	boot_timer>   r>   r>   r?   rŽ   1  s    rŽ   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)rL   Úusersr   Zsuserrp   )rr   r„   r   r…   r,   ÚttyZhostnameZtstampZuser_processr‡   rˆ   r>   r>   r?   r   6  s    
r   c               C   s   dd„ t  ttƒ ƒ¡D ƒS )z7Returns a list of PIDs currently running on the system.c             S   s   g | ]}|  ¡ rt|ƒ‘qS r>   )ÚisdigitrX   )ra   rb   r>   r>   r?   rc   P  s    zpids.<locals>.<listcomp>)rD   Úlistdirr   r@   r>   r>   r>   r?   ÚpidsN  s    r”   c             C   s
   t  | ¡S )z&Check for the existence of a unix pid.)r   Ú
pid_exists)r‡   r>   r>   r?   r•   S  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Š| jdkrHdtƒ krFt| j| jƒ‚n‚ |jtjtjfkr†t| jƒstt	| 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 )Nr   )ÚEnvironmentErrorr‡   r”   ÚAccessDeniedÚ_nameÚerrnoÚENOENTZESRCHr•   ÚNoSuchProcessÚZombieProcessÚ_ppidZEPERMZEACCES)ÚselfÚargsÚkwargsÚerr)Úfunr>   r?   Úwrapper]  s    


z wrap_exceptions.<locals>.wrapperr>   )r¢   r£   r>   )r¢   r?   Úwrap_exceptionsX  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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	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/d0„ ƒZe	d1d2„ ƒZe	d3d4„ ƒZeZe	d5d6„ ƒZe	d7d8„ ƒZ e	d9d:„ ƒZ!d;d<„ Z"e	dLd>d?„ƒZ#e$d@dAƒZ%e$d@dBƒZ&e	dCdD„ ƒZ'e	dEdF„ ƒZ(e	dGdH„ ƒZ)e	dMdJdK„ƒZ*dIS )NÚ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‡   r>   r>   r?   Ú__init__y  s    zProcess.__init__c             C   s   t  d| j| jf ¡ dS )z+Raise NSP if the process disappeared on us.z%s/%sN)rD   Ústatr¦   r‡   )rž   r>   r>   r?   Ú_assert_alive  s    zProcess._assert_alivec             C   s(   | j  | ¡ | j | ¡ | j | ¡ d S )N)Ú_proc_name_and_argsZcache_activateÚ_proc_basic_infoÚ
_proc_cred)rž   r>   r>   r?   Úoneshot_enter…  s    zProcess.oneshot_enterc             C   s(   | j  | ¡ | j | ¡ | j | ¡ d S )N)r«   Zcache_deactivater¬   r­   )rž   r>   r>   r?   Úoneshot_exitŠ  s    zProcess.oneshot_exitc             C   s   t  | j| j¡S )N)rL   Zproc_name_and_argsr‡   r¦   )rž   r>   r>   r?   r«     s    zProcess._proc_name_and_argsc             C   s(   t  | j| j¡}t|ƒttƒks$t‚|S )N)rL   Zproc_basic_infor‡   r¦   ÚlenÚproc_info_mapÚAssertionError)rž   rf   r>   r>   r?   r¬   ”  s    zProcess._proc_basic_infoc             C   s   t  | j| j¡S )N)rL   Z	proc_credr‡   r¦   )rž   r>   r>   r?   r­   ›  s    zProcess._proc_credc             C   s   |   ¡ d S )Nr   )r«   )rž   r>   r>   r?   r      s    zProcess.namec             C   s8   yt  d| j| jf ¡S  tk
r*   Y nX |  ¡  dS )Nz%s/%s/path/a.outrm   )rD   Úreadlinkr¦   r‡   ÚOSErrorÚcmdline)rž   r>   r>   r?   Úexe¥  s    zProcess.exec             C   s   |   ¡ d  d¡S )Nr   r;   )r«   rW   )rž   r>   r>   r?   rµ   ²  s    zProcess.cmdlinec             C   s   t  | j| j¡S )N)rL   Zproc_environr‡   r¦   )rž   r>   r>   r?   rO   ¶  s    zProcess.environc             C   s   |   ¡ td  S )Nr"   )r¬   r±   )rž   r>   r>   r?   r"   º  s    zProcess.create_timec             C   s   |   ¡ td  S )Nr$   )r¬   r±   )rž   r>   r>   r?   r$   ¾  s    zProcess.num_threadsc             C   s   |   ¡ td  S )Nr#   )r¬   r±   )rž   r>   r>   r?   Únice_getÂ  s    zProcess.nice_getc             C   s&   | j dkrt| j | jƒ‚t | j |¡S )N)r   r   )r‡   r—   r˜   Ú
cext_posixÚsetpriority)rž   Úvaluer>   r>   r?   Únice_setÉ  s    
zProcess.nice_setc             C   s   |   ¡ td  | _| jS )Nr   )r¬   r±   r   )rž   r>   r>   r?   r   Ó  s    zProcess.ppidc             C   s`   y|   ¡ \}}}}}}W n8 tk
rP   |  ¡ td  }|  ¡ td  }d }Y nX t |||¡S )Nr'   r(   )r­   r—   r¬   r±   r   Úpuids)rž   ÚrealÚ	effectiveÚsavedÚ_r>   r>   r?   ÚuidsØ  s    
zProcess.uidsc             C   s`   y|   ¡ \}}}}}}W n8 tk
rP   |  ¡ td  }|  ¡ td  }d }Y nX t |||¡S )Nr)   r*   )r­   r—   r¬   r±   r   r¼   )rž   rÀ   r½   r¾   r¿   r>   r>   r?   Úgidsâ  s    
zProcess.gidsc          
   C   sZ   yt  | j| j¡}W n: tk
rN } z|jtjkr<ts<d}n‚ W d d }~X Y nX tj	|Ž S )N)g        g        g        g        )
rL   Zproc_cpu_timesr‡   r¦   r´   r™   Ú	EOVERFLOWÚ	IS_64_BITr   r.   )rž   Útimesr¡   r>   r>   r?   rg   ì  s    zProcess.cpu_timesc             C   s   t  | j| j¡S )N)rL   Zproc_cpu_numr‡   r¦   )rž   r>   r>   r?   Úcpu_numþ  s    zProcess.cpu_numc             C   s”   | j }d}t|  ¡ td  ƒ}|tjkr„xZdD ]R}yt d|| j|f ¡S  t	k
r~ } z|j
t
jkrld}w.‚ W d d }~X Y q.X q.W |r|  ¡  d S )NFr&   )r   r   r   éÿ   z%s/%d/path/%dT)r¦   r¤   r¬   r±   rL   ZPRNODEVrD   r³   r‡   r´   r™   rš   rª   )rž   Úprocfs_pathÚ
hit_enoentr‘   rb   r¡   r>   r>   r?   Úterminal  s     

zProcess.terminalc          
   C   sh   | j }yt d|| jf ¡S  tk
rb } z*|jtjkrPt d|| jf ¡ d S ‚ W d d }~X Y nX d S )Nz%s/%s/path/cwdz%s/%s)r¦   rD   r³   r‡   r´   r™   rš   r©   )rž   rÈ   r¡   r>   r>   r?   Úcwd  s    zProcess.cwdc             C   s2   |   ¡ }|td  d }|td  d }t||ƒS )Nr    i   r!   )r¬   r±   r6   )rž   rf   r    r!   r>   r>   r?   Úmemory_info$  s    zProcess.memory_infoc             C   s   |   ¡ td  }t |d¡S )Nr%   ú?)r¬   r±   ÚPROC_STATUSESÚget)rž   Úcoder>   r>   r?   r%   -  s    zProcess.statusc       
      C   sÂ   | j }g }t d|| jf ¡}d}xŽ|D ]†}t|ƒ}yt | j||¡\}}W nH tk
r” } z*|jtj	krpt
spw(|jtjkr‚d}w(‚ W d d }~X Y q(X t |||¡}	| |	¡ q(W |r¾|  ¡  |S )Nz	%s/%d/lwpFT)r¦   rD   r“   r‡   rX   rL   Zquery_process_threadr–   r™   rÃ   rÄ   rš   r   Zpthreadrp   rª   )
rž   rÈ   rf   ZtidsrÉ   ÚtidÚutimeZstimer¡   rˆ   r>   r>   r?   Úthreads3  s*    
zProcess.threadsc       	      C   sÈ   g }d}| j }d|| jf }xšt d|| jf ¡D ]‚}tj ||¡}tj |¡r2yt |¡}W n6 tk
r” } z|j	t	j
kr‚d}w2‚ W d d }~X Y q2X t|ƒr2| t |t|ƒ¡¡ q2W |rÄ|  ¡  |S )NFz
%s/%d/pathz%s/%d/fdT)r¦   r‡   rD   r“   r8   ry   Úislinkr³   r´   r™   rš   r
   rp   r   Z	popenfilerX   rª   )	rž   rr   rÉ   rÈ   Zpathdirr†   r8   Úfiler¡   r>   r>   r?   Ú
open_filesT  s&    zProcess.open_filesc             c   s,  d| }t j|dt jt jd}| ¡ \}}trDdd„ ||fD ƒ\}}|jdkr’d| ¡ krht| j| j	ƒ‚d| ¡ kr‚t
| j| j	ƒ‚td	||f ƒ‚| d
¡dd… }x‚t|ƒD ]v\}}| ¡ }| d¡r®| dd¡d }	||d   ¡ }
|
dkrøtj}
n|
dkr
tj}
nd}
dtj|
|	dtjfV  q®W dS )z<Get UNIX sockets used by process by parsing 'pfiles' output.z	pfiles %sT)ÚshellrI   rZ   c             S   s   g | ]}|  tjj¡‘qS r>   )rR   r<   rI   rS   )ra   rb   r>   r>   r?   rc   u  s   z-Process._get_unix_sockets.<locals>.<listcomp>r   zpermission deniedzno such processz%r command error
%srJ   r   Nzsockname: AF_UNIXr;   ÚSOCK_STREAMÚ
SOCK_DGRAMrt   rm   )rM   rN   rP   rQ   r   rT   Úlowerr—   r‡   r˜   r›   rU   rW   Ú	enumerateÚlstripÚ
startswithrV   ÚsocketrØ   rÙ   ZAF_UNIXr   Ú	CONN_NONE)rž   r‡   ÚcmdrY   rI   rZ   r[   Úir\   r8   Útyper>   r>   r?   Ú_get_unix_socketsl  s2    



zProcess._get_unix_socketsÚinetc             C   sP   t || jd}|s(t d| j| jf ¡ |dkrL| dd„ |  | j¡D ƒ¡ |S )N)r‚   z%s/%s)rq   ru   c             S   s   g | ]}t j|Ž ‘qS r>   )r   r~   )ra   Zconnr>   r>   r?   rc   š  s    z'Process.connections.<locals>.<listcomp>)rz   r‡   rD   r©   r¦   Úextendrã   )rž   r   rf   r>   r>   r?   ÚconnectionsŒ  s    
zProcess.connectionsZmmapzpath rss anon lockedzaddr perms path rss anon lockedc             C   s   dd„ }| j }g }yt | j|¡}W n8 tk
r\ } z|jtjkrJtsJg S ‚ W d d }~X Y nX d}xª|D ]¢}|\}}	}
}}}}|||	ƒ}| d¡sôyt	 
d|| j|f ¡}W nF tk
rò } z(|jtjkràd|| j|f }d}n‚ W d d }~X Y nX | ||
||||f¡ qhW |r|  ¡  |S )Nc             S   s0   dt | ƒdd …  d¡t |ƒdd …  d¡f S )Nz%s-%sr   ÚL)ÚhexrV   )ÚstartÚendr>   r>   r?   Útoaddr£  s    z#Process.memory_maps.<locals>.toaddrFú[z%s/%s/path/%sT)r¦   rL   Zproc_memory_mapsr‡   r´   r™   rÃ   rÄ   rÝ   rD   r³   rš   rp   rª   )rž   rë   rÈ   rr   r„   r¡   rÉ   r…   r|   ZaddrsizeZpermr   r    Zanonr9   r>   r>   r?   Úmemory_maps¡  s4    


zProcess.memory_mapsc             C   s   t t d| j| jf ¡ƒS )Nz%s/%s/fd)r°   rD   r“   r¦   r‡   )rž   r>   r>   r?   Únum_fdsÐ  s    zProcess.num_fdsc             C   s   t jt | j| j¡Ž S )N)r   ZpctxswrL   Zproc_num_ctx_switchesr‡   r¦   )rž   r>   r>   r?   Únum_ctx_switchesÔ  s    zProcess.num_ctx_switchesNc             C   s   t  | j|| j¡S )N)r   Zwait_pidr‡   r˜   )rž   Ztimeoutr>   r>   r?   ÚwaitÙ  s    zProcess.wait)rä   )N)+Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r¨   rª   r®   r¯   r¤   r   r«   r¬   r­   r   r¶   rµ   rO   r"   r$   r·   r»   r   rÁ   rÂ   rg   rÆ   rÊ   rË   rÌ   Zmemory_full_infor%   rÓ   rÖ   rã   ræ   r   Znt_mmap_groupedZnt_mmap_extrí   rî   rï   rð   r>   r>   r>   r?   r¥   t  sT   


! 

/r¥   )F)rt   )orô   r™   rD   rÞ   rM   r<   Úcollectionsr   r   rm   r   r   r   r¸   r   rL   r	   r
   r   r   r   r   Z_compatr   r   Z__extra__all__rE   rF   ZAF_LINKÚmaxsizerÄ   r   r   ZSSLEEPZSTATUS_SLEEPINGZSRUNZSTATUS_RUNNINGZSZOMBZSTATUS_ZOMBIEZSSTOPZSTATUS_STOPPEDZSIDLZSTATUS_IDLEZSONPROCZSWAITZSTATUS_WAITINGrÎ   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_NONErß   Z	TCPS_IDLEZ
TCPS_BOUNDr}   Údictr±   r›   rœ   r—   ZTimeoutExpiredr+   r.   r1   r6   Zpfullmemr7   ry   Ú_fieldsr:   r@   rG   r_   rg   rd   rj   rk   rl   Zdisk_io_countersro   rn   Znet_io_countersZnet_if_addrsrz   rŠ   rŽ   r   r”   r•   r¤   Úobjectr¥   r>   r>   r>   r?   Ú<module>   s¼   



	
&	

$