U
    ˜Ëj~]  ã                   @   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dgZe ¡ 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j0ej1iZ2e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jHejIejJejKe#ejLe$iZMeNddddddd d!d"d#d$d%d&�ZOd'd(„ ZPd)d*„ ZQd+d,„ ZRd-d.„ ZSd/d0„ ZTd1d2„ ZUd3d4„ ZVejWZWejXZXdId6d7„ZYejZZZej[Z[dJd9d:„Z\d;d<„ Z]d=d>„ Z^d?d@„ Z_dAdB„ Z`dCdD„ ZadEdF„ ZbG dGdH„ dHƒZcdS )Kz'Sun OS Solaris platform implementation.é    N)Ú
namedtuple)ÚAF_INETé   )Ú_common)Ú_ntuples)Ú_psposix)Ú_psutil_sunos)ÚAF_INET6)ÚENCODING)ÚAccessDenied)ÚNoSuchProcess)ÚZombieProcess)Údebug)Úget_procfs_path)Úisfile_strict)Úmemoize_when_activated)Úsockfam_to_enum)Úsocktype_to_enum)Úusage_percentÚ	CONN_IDLEÚ
CONN_BOUNDZPROCFS_PATHl        ZIDLEZBOUNDé   é   é   é   é   é   é   é	   é
   é   )ÚppidÚrssÚvmsÚcreate_timeÚniceÚnum_threadsÚstatusÚttynrÚuidÚeuidÚgidÚegidc                  C   sH   t  d¡t } t  d¡t  }}| | }t|| dd�}t | ||||¡S )zReport virtual memory metrics.ÚSC_PHYS_PAGESÚSC_AVPHYS_PAGESr   ©Zround_)ÚosÚsysconfÚ	PAGE_SIZEr   ÚntpZsvmem)ÚtotalÚfreeZavailÚusedÚpercent© r8   ú3/tmp/pip-unpacked-wheel-3no1_rt3/psutil/_pssunos.pyÚvirtual_memory`   s
    r:   c               	   C   s  t  ¡ \} }tjddtjd › �ddgtjd�}| ¡ \}}| t	j
j¡}|jdkrjd|j› d	�}t|ƒ‚| ¡  d
¡dd… }|s�d}t|ƒ‚d }}|D ]D}	|	 ¡ }	|	dd… \}
}|tt|
ƒd ƒ7 }|tt|ƒd ƒ7 }qœ|| }t||dd�}t ||||| t |t ¡S )zReport swap memory metrics.z/usr/bin/envzPATH=/usr/sbin:/sbin:ÚPATHZswapz-l)Ústdoutr   z'swap -l' failed (retcode=ú)Ú
r   Nzno swap device(s) configuredr   r   i   r/   )ÚcextZswap_memÚ
subprocessÚPopenr0   ÚenvironÚPIPEÚcommunicateÚdecodeÚsysr<   ÚencodingÚ
returncodeÚRuntimeErrorÚstripÚsplitÚintr   r3   Zsswapr2   )ÚsinZsoutÚpr<   Ú_ÚmsgÚlinesr4   r5   ÚlineÚtÚfr6   r7   r8   r8   r9   Úswap_memoryk   sD    üù	
     ÿrU   c                  C   s    t  ¡ } tjdd„ t| Ž D ƒŽ S )z.Return system-wide CPU times as a named tuple.c                 S   s   g | ]}t |ƒ‘qS r8   )Úsum©Ú.0Úxr8   r8   r9   Ú
<listcomp>œ   s     zcpu_times.<locals>.<listcomp>)r?   Úper_cpu_timesr3   Ú	scputimesÚzip©Úretr8   r8   r9   Ú	cpu_times™   s    r`   c                  C   s   t  ¡ } dd„ | D ƒS )z6Return system per-CPU times as a list of named tuples.c                 S   s   g | ]}t j|Ž ‘qS r8   )r3   r\   rW   r8   r8   r9   rZ   ¢   s     z!per_cpu_times.<locals>.<listcomp>)r?   r[   r^   r8   r8   r9   r[   Ÿ   s    r[   c                   C   s(   zt  d¡W S  tk
r"   Y dS X dS )z0Return the number of logical CPUs in the system.ÚSC_NPROCESSORS_ONLNN)r0   r1   Ú
ValueErrorr8   r8   r8   r9   Úcpu_count_logical¥   s    rc   c                   C   s   t  ¡ S )z-Return the number of CPU cores in the system.)r?   Úcpu_count_coresr8   r8   r8   r9   rd   ®   s    rd   c                  C   s$   t  ¡ \} }}}d}t | |||¡S )z*Return various CPU stats as a named tuple.r   )r?   Ú	cpu_statsr3   Z	scpustats)Zctx_switchesZ
interruptsZsyscallsZ_trapsZsoft_interruptsr8   r8   r9   re   ³   s    re   Fc           
      C   s¢   g }t  ¡ }|D ]Œ}|\}}}}|dkr,d}| s‚zt|ƒjs@W qW n> tk
r€ } z td|›d|› �ƒ W Y ¢qW 5 d}~X Y nX t ||||¡}	| |	¡ q|S )zReturn system disk partitions.ÚnoneÚ z	skipping z: N)	r?   Údisk_partitionsÚ
disk_usager4   ÚOSErrorr   r3   Z	sdiskpartÚappend)
ÚallÚretlistZ
partitionsÚ	partitionZdeviceZ
mountpointZfstypeÚoptsÚerrZntupler8   r8   r9   rh   Ã   s     
rh   éÿÿÿÿc              
   C   sÔ   t j|  \}}t |¡}tƒ }|D ]¨}|\}}}	}
}}}||krBq"|	|krLq"|tthkrt|
rftj|
Ž }
|rttj|Ž }t	| }t
|ƒ}t|	ƒ}	|dkr¬t |||	|
|||¡}nt |||	|
||¡}| |¡ q"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).
    rq   )r   Z	conn_tmapr?   Únet_connectionsÚsetr   r	   r3   ÚaddrÚTCP_STATUSESr   r   ZsconnÚpconnÚaddÚlist)ÚkindÚ_pidZfamiliesÚtypesÚrawlistr_   ÚitemÚfdZfamÚtype_ÚladdrÚraddrr'   ÚpidÚntr8   r8   r9   rr   æ   s,    


rr   c                  C   sT   t  ¡ } |  ¡ D ]>\}}|\}}}}ttdƒr8t |¡}t ||||d¡| |< q| S )z)Get NIC stats (isup, duplex, speed, mtu).Ú	NicDuplexrg   )r?   Únet_if_statsÚitemsÚhasattrr   r„   r3   Z	snicstats)r_   Únamer†   ZisupZduplexÚspeedZmtur8   r8   r9   r…     s    

r…   c                   C   s   t  ¡ S )z:The system boot time expressed in seconds since the epoch.)r?   Ú	boot_timer8   r8   r8   r9   rŠ     s    rŠ   c                  C   s\   g } t  ¡ }d}|D ]B}|\}}}}}}	|s.q||kr:d}t |||||	¡}
|  |
¡ q| S )z:Return currently connected users as a list of namedtuples.)z:0.0z:0Ú	localhost)r?   Úusersr3   Zsuserrk   )rm   r|   r‹   r}   ÚuserÚttyÚhostnameZtstampZuser_processr‚   rƒ   r8   r8   r9   rŒ     s    rŒ   c                  C   s    t ƒ  t¡} dd„ t | ¡D ƒS )z7Returns a list of PIDs currently running on the system.c                 S   s   g | ]}|  ¡ rt|ƒ‘qS r8   )ÚisdigitrL   rW   r8   r8   r9   rZ   5  s      zpids.<locals>.<listcomp>)r   Úencoder
   r0   Úlistdir)Úpathr8   r8   r9   Úpids2  s    r”   c                 C   s
   t  | ¡S )z&Check for the existence of a unix pid.)r   Ú
pid_exists)r‚   r8   r8   r9   r•   8  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              
      sä   | j | j| j  }}}zˆ | f|ž|ŽW S  ttfk
rp } z&t|ƒsRt||ƒ|‚t|||ƒ|‚W 5 d }~X Y np tk
rœ } zt	||ƒ|‚W 5 d }~X Y nD t
k
rÞ } z&|dkrÌdtƒ krÊt	||ƒ|‚‚ ‚ W 5 d }~X Y nX d S ©Nr   )r‚   Ú_ppidÚ_nameÚFileNotFoundErrorÚProcessLookupErrorr•   r   r   ÚPermissionErrorr   rj   r”   )ÚselfÚargsÚkwargsr‚   r!   rˆ   rp   ©Úfunr8   r9   ÚwrapperB  s    
z wrap_exceptions.<locals>.wrapper)Ú	functoolsÚwraps)r    r¡   r8   rŸ   r9   Úwrap_exceptions=  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.Ú_cacher˜   r—   Ú_procfs_pathr‚   c                 C   s   || _ d | _d | _tƒ | _d S ©N)r‚   r˜   r—   r   r§   )rœ   r‚   r8   r8   r9   Ú__init___  s    zProcess.__init__c                 C   s   t  | j› d| j› �¡ dS )z+Raise NSP if the process disappeared on us.ú/N)r0   Ústatr§   r‚   ©rœ   r8   r8   r9   Ú_assert_alivee  s    zProcess._assert_alivec                 C   s(   | j  | ¡ | j | ¡ | j | ¡ d S r¨   )Ú_proc_name_and_argsZcache_activateÚ_proc_basic_infoÚ
_proc_credr¬   r8   r8   r9   Úoneshot_enterk  s    zProcess.oneshot_enterc                 C   s(   | j  | ¡ | j | ¡ | j | ¡ d S r¨   )r®   Zcache_deactivater¯   r°   r¬   r8   r8   r9   Úoneshot_exitp  s    zProcess.oneshot_exitc                 C   s   t  | j| j¡S r¨   )r?   Zproc_name_and_argsr‚   r§   r¬   r8   r8   r9   r®   u  s    zProcess._proc_name_and_argsc                 C   sX   | j dkr0tj | j› d| j › d�¡s0t| j ƒ‚t | j | j¡}t|ƒtt	ƒksTt
‚|S )Nr   rª   z/psinfo)r‚   r0   r“   Úexistsr§   r   r?   Zproc_basic_infoÚlenÚproc_info_mapÚAssertionError)rœ   r_   r8   r8   r9   r¯   z  s    ÿ
zProcess._proc_basic_infoc                 C   s   t  | j| j¡S r¨   )r?   Z	proc_credr‚   r§   r¬   r8   r8   r9   r°   …  s    zProcess._proc_credc                 C   s   |   ¡ d S r–   ©r®   r¬   r8   r8   r9   rˆ   Š  s    zProcess.namec                 C   s>   zt  | j› d| j› d�¡W S  tk
r0   Y nX |  ¡  dS )Nrª   z/path/a.outrg   )r0   Úreadlinkr§   r‚   rj   Úcmdliner¬   r8   r8   r9   Úexe�  s    zProcess.exec                 C   s   |   ¡ d S )Nr   r·   r¬   r8   r8   r9   r¹   ›  s    zProcess.cmdlinec                 C   s   t  | j| j¡S r¨   )r?   Zproc_environr‚   r§   r¬   r8   r8   r9   rB   Ÿ  s    zProcess.environc                 C   s   |   ¡ td  S )Nr$   ©r¯   rµ   r¬   r8   r8   r9   r$   £  s    zProcess.create_timec                 C   s   |   ¡ td  S )Nr&   r»   r¬   r8   r8   r9   r&   §  s    zProcess.num_threadsc                 C   s   |   ¡ td  S )Nr%   r»   r¬   r8   r8   r9   Ú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˜   r?   Zproc_priority_set)rœ   Úvaluer8   r8   r9   Únice_set²  s    
zProcess.nice_setc                 C   s   |   ¡ td  | _| jS )Nr!   )r¯   rµ   r—   r¬   r8   r8   r9   r!   ¼  s    zProcess.ppidc                 C   s`   z|   ¡ \}}}}}}W n8 tk
rP   |  ¡ td  }|  ¡ td  }d }Y nX t |||¡S )Nr)   r*   ©r°   r   r¯   rµ   r3   Zpuids)rœ   ÚrealÚ	effectiveÚsavedrO   r8   r8   r9   ÚuidsÁ  s    
zProcess.uidsc                 C   s`   z|   ¡ \}}}}}}W n8 tk
rP   |  ¡ td  }|  ¡ td  }d }Y nX t |||¡S )Nr+   r,   r¿   )rœ   rO   rÀ   rÁ   rÂ   r8   r8   r9   ÚgidsË  s    
zProcess.gidsc              
   C   sZ   zt  | j| j¡}W n: tk
rN } z|jtjkr<ts<d}n‚ W 5 d }~X Y nX tj	|Ž S )N)ç        rÅ   rÅ   rÅ   )
r?   Zproc_cpu_timesr‚   r§   rj   ÚerrnoÚ	EOVERFLOWÚ	IS_64_BITr3   Z	pcputimes)rœ   Útimesrp   r8   r8   r9   r`   Õ  s    zProcess.cpu_timesc                 C   s   t  | j| j¡S r¨   )r?   Zproc_cpu_numr‚   r§   r¬   r8   r8   r9   Úcpu_numç  s    zProcess.cpu_numc              	   C   s‚   | j }d}t|  ¡ td  ƒ}|tjkrrdD ]D}z"t |› d| j› d|› �¡W   S  t	k
rn   d}Y q,Y q,X q,|r~|  
¡  d S )NFr(   )r   r   r   éÿ   rª   ú/path/T)r§   r¤   r¯   rµ   r?   ZPRNODEVr0   r¸   r‚   r™   r­   )rœ   Úprocfs_pathÚ
hit_enoentrŽ   rY   r8   r8   r9   Úterminalë  s    
"zProcess.terminalc                 C   sR   | j }zt |› d| j› d�¡W S  tk
rL   t |› d| j› �¡ Y dS X d S )Nrª   z	/path/cwdrg   )r§   r0   r¸   r‚   r™   r«   )rœ   rÍ   r8   r8   r9   Úcwdú  s    zProcess.cwdc                 C   s4   |   ¡ }|td  d }|td  d }t ||¡S )Nr"   i   r#   )r¯   rµ   r3   Zpmem)rœ   r_   r"   r#   r8   r8   r9   Úmemory_info  s    zProcess.memory_infoc                 C   s   |   ¡ td  }t |d¡S )Nr'   ú?)r¯   rµ   ÚPROC_STATUSESÚget)rœ   Úcoder8   r8   r9   r'     s    zProcess.statusc           
      C   sÎ   | j }g }t |› d| j› d�¡}d}|D ]’}t|ƒ}zt | j||¡\}}W nT tk
r¢ } z6|jtj	krxt
sxW Y ¢ q*|jtjkr�d}W Y ¢q*‚ W 5 d }~X Y q*X t |||¡}	| |	¡ q*|rÊ|  ¡  |S )Nrª   z/lwpFT)r§   r0   r’   r‚   rL   r?   Zquery_process_threadrj   rÆ   rÇ   rÈ   ÚENOENTr3   Zpthreadrk   r­   )
rœ   rÍ   r_   ZtidsrÎ   ÚtidÚutimeZstimerp   rƒ   r8   r8   r9   Úthreads  s0      ÿzProcess.threadsc              	   C   s²   g }d}| j }|› d| j› d�}t |› d| j› d�¡D ]h}tj ||¡}tj |¡r8zt |¡}W n tk
r€   d}Y q8Y q8X t	|ƒr8| 
t |t|ƒ¡¡ q8|r®|  ¡  |S )NFrª   z/pathú/fdT)r§   r‚   r0   r’   r“   ÚjoinÚislinkr¸   r™   r   rk   r3   Z	popenfilerL   r­   )rœ   rm   rÎ   rÍ   Zpathdirr~   r“   Úfiler8   r8   r9   Ú
open_files8  s"    
zProcess.open_filesc                 c   s,  dt |ƒg}tj|tjtjd�}| ¡ \}}dd„ ||fD ƒ\}}|jdkr–d| ¡ krft| j| j	ƒ‚d| ¡ kr€t
| j| j	ƒ‚|›d|› �}t|ƒ‚| d	¡d
d… }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°dS )z<Get UNIX sockets used by process by parsing 'pfiles' output.Zpfiles)r<   Ústderrc                 s   s   | ]}|  tjj¡V  qd S r¨   )rE   rF   r<   rG   rW   r8   r8   r9   Ú	<genexpr>V  s    z,Process._get_unix_sockets.<locals>.<genexpr>r   zpermission deniedzno such processz command error
r>   r   Nzsockname: AF_UNIXú ÚSOCK_STREAMÚ
SOCK_DGRAMrq   rg   )Ústrr@   rA   rC   rD   rH   Úlowerr   r‚   r˜   r   rI   rK   Ú	enumerateÚlstripÚ
startswithrJ   Úsocketrâ   rã   ÚAF_UNIXr   Ú	CONN_NONE)rœ   r‚   ÚcmdrN   r<   rß   rP   rQ   ÚirR   r“   Útyper8   r8   r9   Ú_get_unix_socketsM  s:      ÿÿ



zProcess._get_unix_socketsÚinetc                 C   sR   t || jd�}|s*t | j› d| j› �¡ |dkrN| dd„ |  | j¡D ƒ¡ |S )N)rz   rª   >   rl   Úunixc                 S   s   g | ]}t j|Ž ‘qS r8   )r3   rv   )rX   Úconnr8   r8   r9   rZ   ~  s     z+Process.net_connections.<locals>.<listcomp>)rr   r‚   r0   r«   r§   Úextendrï   )rœ   ry   r_   r8   r8   r9   rr   o  s    ÿzProcess.net_connectionsZmmapzpath rss anon lockedzaddr perms path rss anon lockedc                 C   s4  dd„ }| j }g }zt | j|¡}W n@ tk
rd } z"|jtjkrRtsRg  W Y ¢S ‚ W 5 d }~X Y nX d}|D ]²}|\}}	}
}}}}|||	ƒ}| d¡�s
z t	 
|› d| j› d|› �¡}W nN tk
�r } z.|jtjkrö|› d| j› d|› �}d}n‚ W 5 d }~X Y nX | ||
||||f¡ qn|�r0|  ¡  |S )Nc                 S   s0   d  t| ƒdd …  d¡t|ƒdd …  d¡¡S )Nz{}-{}r   ÚL)ÚformatÚhexrJ   )ÚstartÚendr8   r8   r9   Útoaddr‡  s     ÿz#Process.memory_maps.<locals>.toaddrFú[rª   rÌ   T)r§   r?   Zproc_memory_mapsr‚   rj   rÆ   rÇ   rÈ   rè   r0   r¸   rÖ   rk   r­   )rœ   rù   rÍ   rm   r|   rp   rÎ   r}   rt   ZaddrsizeÚpermrˆ   r"   ZanonÚlockedr8   r8   r9   Úmemory_maps…  s2    
 zProcess.memory_mapsc                 C   s   t t | j› d| j› d�¡ƒS )Nrª   rÚ   )r´   r0   r’   r§   r‚   r¬   r8   r8   r9   Únum_fds´  s    zProcess.num_fdsc                 C   s   t jt | j| j¡Ž S r¨   )r3   Zpctxswr?   Zproc_num_ctx_switchesr‚   r§   r¬   r8   r8   r9   Únum_ctx_switches¸  s    ÿzProcess.num_ctx_switchesNc                 C   s   t  | j|¡S r¨   )r   Zwait_pidr‚   )rœ   Útimeoutr8   r8   r9   Úwait¾  s    zProcess.wait)rð   )N)+Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r©   r­   r±   r²   r¤   r   r®   r¯   r°   rˆ   rº   r¹   rB   r$   r&   r¼   r¾   r!   rÃ   rÄ   r`   rÊ   rÏ   rÐ   rÑ   Zmemory_full_infor'   rÙ   rÞ   rï   rr   r   Znt_mmap_groupedZnt_mmap_extrý   rþ   rÿ   r  r8   r8   r8   r9   r¥   Z  s†   	







	

	
	






!
"


.

r¥   )F)rq   )dr  rÆ   r¢   r0   ré   r@   rF   Úcollectionsr   r   rg   r   r   r3   r   r   r?   r	   r
   r   r   r   r   r   r   r   r   r   r   Z__extra__all__Zgetpagesizer2   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_BOUNDru   Údictrµ   r:   rU   r`   r[   rc   rd   re   Zdisk_io_countersri   rh   Znet_io_countersZnet_if_addrsrr   r…   rŠ   rŒ   r”   r•   r¤   r¥   r8   r8   r8   r9   Ú<module>   sØ   

       ù              òô.	

