U
    (cc                     @   sL  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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j0ej1ej2ej3ej4ej-ej5ej6iZ7e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jLejMejNejOejPe(ejQe)iZReSddd d!d"d#d$d%d&d'd(d)d*ZTed+d,d-d.d/gZUed0d,d-d1d2gZVed3d4d5d6d7d8gZWed9d:d;gZXeXZYed<d=d:d>d?gZZed@dAdB[eZj\ Z]dCdD Z^dEdF Z_dGdH Z`dIdJ ZadKdL ZbdMdN ZcdOdP ZdejeZeejfZfdedRdSZgejhZhejiZidfdUdVZjdWdX ZkdYdZ Zld[d\ Zmd]d^ Znd_d` Zodadb ZpG dcdd ddeqZrdS )gz'Sun OS Solaris platform implementation.    N)
namedtuple)AF_INET   )_common)_psposix)_psutil_posix)_psutil_sunos)AF_INET6)AccessDenied)NoSuchProcess)ZombieProcess)debug)get_procfs_path)isfile_strict)memoize_when_activated)sockfam_to_enum)socktype_to_enum)usage_percent)PY3)FileNotFoundError)PermissionError)ProcessLookupError)b	CONN_IDLE
CONN_BOUNDZPROCFS_PATHl        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total	availablepercentusedfreepmemr&   r'   pmmap_groupedpathZ	anonymouslocked	pmmap_extzaddr perms  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   Zround_)ossysconf	PAGE_SIZEr   r7   )r8   r<   Zavailr;   r:    rI   3/tmp/pip-unpacked-wheel-l83rk7k5/psutil/_pssunos.pyvirtual_memory{   s
    rK   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 }|std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:%sPATHZswapz-l)stdoutr   z'swap -l' failed (retcode=%s)
r   Nzno swap device(s) configuredr   r   i   rE   )cextZswap_mem
subprocessPopenrF   environPIPEcommunicater   decodesysrM   encoding
returncodeRuntimeErrorstripsplitintr   r   ZsswaprH   )sinZsoutprM   stderrlinesr8   r<   linetfr;   r:   rI   rI   rJ   swap_memory   s:     
 rd   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 rI   )sum.0xrI   rI   rJ   
<listcomp>   s     zcpu_times.<locals>.<listcomp>)rO   per_cpu_timesr1   zipretrI   rI   rJ   	cpu_times   s    rn   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 rI   )r1   rf   rI   rI   rJ   ri      s     z!per_cpu_times.<locals>.<listcomp>)rO   rj   rl   rI   rI   rJ   rj      s    rj   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)rF   rG   
ValueErrorrI   rI   rI   rJ   cpu_count_logical   s    rq   c                   C   s   t  S )z-Return the number of CPU cores in the system.)rO   cpu_count_coresrI   rI   rI   rJ   rr      s    rr   c                  C   s$   t  \} }}}d}t| |||S )z*Return various CPU stats as a named tuple.r   )rO   	cpu_statsr   Z	scpustats)Zctx_switchesZ
interruptsZsyscallsZtrapsZsoft_interruptsrI   rI   rJ   rs      s
    
rs   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||f  W Y qW 5 d}~X Y nX d }	}
t|||||	|
}|| q|S )zReturn system disk partitions.none zskipping %r: %sN)	rO   disk_partitions
disk_usager8   OSErrorr   r   Z	sdiskpartappend)allretlistZ
partitions	partitionZdeviceZ
mountpointZfstypeoptserrZmaxfileZmaxpathZntuplerI   rI   rJ   rv      s(    
 rv   c              
   C   s  t j }|dkr|dd | |krFtd| ddd |D f t j|  \}}t|}t }|D ]}|\}}	}
}}}}|	|krqh|
|krqh|	t	t
fkr|rt j| }|rt j| }t| }t|	}	t|
}
|dkrt ||	|
||||}nt ||	|
|||}|| qht|S )zReturn 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).
    r   unixr   z+invalid %r kind argument; choose between %sz, c                 S   s   g | ]}t |qS rI   )reprrf   rI   rI   rJ   ri     s     z#net_connections.<locals>.<listcomp>)r   Z	conn_tmapcopypoprp   joinrO   net_connectionssetr   r	   addrTCP_STATUSESr   r   Zsconnpconnaddlist)kind_pidZcmapZfamiliestypesrawlistrm   itemfdZfamtype_laddrraddrr+   pidntrI   rI   rJ   r      s:    



r   c                  C   sT   t  } |  D ]>\}}|\}}}}ttdr8t|}t||||d| |< q| S )z)Get NIC stats (isup, duplex, speed, mtu).	NicDuplexru   )rO   net_if_statsitemshasattrr   r   Z	snicstats)rm   namer   ZisupZduplexspeedZmturI   rI   rJ   r   !  s    

r   c                   C   s   t  S )z:The system boot time expressed in seconds since the epoch.)rO   	boot_timerI   rI   rI   rJ   r   1  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)rO   usersr   Zsuserry   )r{   r   r   r   r2   ttyhostnameZtstampZuser_processr   r   rI   rI   rJ   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 rI   )isdigitr\   rf   rI   rI   rJ   ri   P  s      zpids.<locals>.<listcomp>)rF   listdirr   r   rI   rI   rI   rJ   pidsN  s    r   c                 C   s
   t | S )z&Check for the existence of a unix pid.)r   
pid_exists)r   rI   rI   rJ   r   S  s    r   c                    s   t   fdd}|S )zCall callable into a try/except clause and translate ENOENT,
    EACCES and EPERM in NoSuchProcess or AccessDenied exceptions.
    c              	      s   z | f||W S  t tfk
rV   t| js@t| j| jnt| j| j| jY n\ tk
rv   t	| j| jY n< t
k
r   | jdkrdt krt	| j| jn  Y nX d S Nr   )r   r   r   r   r   _namer   _ppidr   r
   rx   r   )selfargskwargsfunrI   rJ   wrapper\  s    


z wrap_exceptions.<locals>.wrapper)	functoolswraps)r   r   rI   r   rJ   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   rI   rI   rJ   __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.%s/%sN)rF   statr   r   r   rI   rI   rJ   _assert_alive  s    zProcess._assert_alivec                 C   s(   | j |  | j|  | j|  d S r   )_proc_name_and_argsZcache_activate_proc_basic_info
_proc_credr   rI   rI   rJ   oneshot_enter  s    zProcess.oneshot_enterc                 C   s(   | j |  | j|  | j|  d S r   )r   Zcache_deactivater   r   r   rI   rI   rJ   oneshot_exit  s    zProcess.oneshot_exitc                 C   s   t | j| jS r   )rO   Zproc_name_and_argsr   r   r   rI   rI   rJ   r     s    zProcess._proc_name_and_argsc                 C   sT   | j dkr,tjd| j| j f s,t| j t| j | j}t|tt	ksPt
|S )Nr   z%s/%s/psinfo)r   rF   r?   existsr   r
   rO   Zproc_basic_infolenproc_info_mapAssertionError)r   rm   rI   rI   rJ   r     s    

zProcess._proc_basic_infoc                 C   s   t | j| jS r   )rO   Z	proc_credr   r   r   rI   rI   rJ   r     s    zProcess._proc_credc                 C   s   |   d S r   )r   r   rI   rI   rJ   r     s    zProcess.namec                 C   s:   zt d| j| jf W S  tk
r,   Y nX |   dS )Nz%s/%s/path/a.outru   )rF   readlinkr   r   rx   cmdliner   rI   rI   rJ   exe  s    zProcess.exec                 C   s   |   d dS )Nr   rB   )r   r[   r   rI   rI   rJ   r     s    zProcess.cmdlinec                 C   s   t | j| jS r   )rO   Zproc_environr   r   r   rI   rI   rJ   rR     s    zProcess.environc                 C   s   |   td  S )Nr(   r   r   r   rI   rI   rJ   r(     s    zProcess.create_timec                 C   s   |   td  S )Nr*   r   r   rI   rI   rJ   r*     s    zProcess.num_threadsc                 C   s   |   td  S )Nr)   r   r   rI   rI   rJ   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   valuerI   rI   rJ   nice_set  s    
zProcess.nice_setc                 C   s   |   td  | _| jS )Nr%   )r   r   r   r   rI   rI   rJ   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   r   Zpuids)r   real	effectivesaved_rI   rI   rJ   uids  s    
zProcess.uidsc                 C   s`   z|   \}}}}}}W n8 tk
rP   |  td  }|  td  }d }Y nX t|||S )Nr/   r0   r   )r   r   r   r   r   rI   rI   rJ   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   )
rO   Zproc_cpu_timesr   r   rx   errno	EOVERFLOW	IS_64_BITr   r4   )r   timesr~   rI   rI   rJ   rn     s    zProcess.cpu_timesc                 C   s   t | j| jS r   )rO   Zproc_cpu_numr   r   r   rI   rI   rJ   cpu_num  s    zProcess.cpu_numc              	   C   s|   | j }d}t|  td  }|tjkrldD ]>}ztd|| j|f W   S  t	k
rh   d}Y q,Y q,X q,|rx| 
  d S )NFr,   )r   r   r      z%s/%d/path/%dT)r   r   r   r   rO   ZPRNODEVrF   r   r   r   r   )r   procfs_path
hit_enoentr   rh   rI   rI   rJ   terminal  s     

zProcess.terminalc                 C   sL   | j }ztd|| jf W S  tk
rF   td|| jf  Y d S X d S )Nz%s/%s/path/cwdr   )r   rF   r   r   r   r   )r   r   rI   rI   rJ   cwd  s    zProcess.cwdc                 C   s2   |   }|td  d }|td  d }t||S )Nr&   i   r'   )r   r   r=   )r   rm   r&   r'   rI   rI   rJ   memory_info#  s    zProcess.memory_infoc                 C   s   |   td  }t|dS )Nr+   ?)r   r   PROC_STATUSESget)r   coderI   rI   rJ   r+   ,  s    zProcess.statusc           
      C   s   | j }g }td|| jf }d}|D ]}t|}zt| j||\}}W nT tk
r } z6|jtj	krtt
stW Y  q&|jtjkrd}W Y q& W 5 d }~X Y q&X t|||}	||	 q&|r|   |S )Nz	%s/%d/lwpFT)r   rF   r   r   r\   rO   Zquery_process_threadEnvironmentErrorr   r   r   ENOENTr   Zpthreadry   r   )
r   r   rm   Ztidsr   tidutimeZstimer~   r   rI   rI   rJ   threads2  s0      zProcess.threadsc              	   C   s   g }d}| j }d|| jf }td|| jf D ]h}tj||}tj|r0zt|}W n tk
rx   d}Y q0Y q0X t	|r0|
t|t| q0|r|   |S )NFz
%s/%d/pathz%s/%d/fdT)r   r   rF   r   r?   r   islinkr   r   r   ry   r   Z	popenfiler\   r   )r   r{   r   r   Zpathdirr   r?   filerI   rI   rJ   
open_filesS  s"    
zProcess.open_filesc                 c   s(  d| }t j|dt jt jd}| \}}trDdd ||fD \}}|jdkrd| krht| j| j	d| krt
| j| j	td	||f |d
dd }t|D ]v\}}| }|dr|ddd }	||d   }
|
dkrtj}
n|
dkrtj}
nd}
dtj|
|	dtjfV  qdS )z<Get UNIX sockets used by process by parsing 'pfiles' output.z	pfiles %sT)shellrM   r_   c                 S   s   g | ]}| tjjqS rI   )rU   rV   rM   rW   rf   rI   rI   rJ   ri   q  s   z-Process._get_unix_sockets.<locals>.<listcomp>r   zpermission deniedzno such processz%r command error
%srN   r   Nzsockname: AF_UNIXrB   SOCK_STREAM
SOCK_DGRAMr   ru   )rP   rQ   rS   rT   r   rX   lowerr
   r   r   r   rY   r[   	enumeratelstrip
startswithrZ   socketr   r   AF_UNIXr   	CONN_NONE)r   r   cmdr^   rM   r_   r`   ira   r?   typerI   rI   rJ   _get_unix_socketsh  s6    



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   r   )rz   r   c                 S   s   g | ]}t j| qS rI   )r   r   )rg   connrI   rI   rJ   ri     s     z'Process.connections.<locals>.<listcomp>)r   r   rF   r   r   extendr   )r   r   rm   rI   rI   rJ   connections  s    

zProcess.connectionsZmmapzpath rss anon lockedzaddr perms path rss anon lockedc                 C   s$  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szt	
d|| j|f }W nF tk
r } z(|jtjkrd|| j|f }d}n W 5 d }~X Y nX |||
||||f qn|r |   |S )Nc                 S   s0   dt | dd  dt |dd  df S )Nz%s-%sr   L)hexrZ   )startendrI   rI   rJ   toaddr  s    z#Process.memory_maps.<locals>.toaddrF[z%s/%s/path/%sT)r   rO   Zproc_memory_mapsr   rx   r   r   r   r   rF   r   r   ry   r   )r   r  r   r{   r   r~   r   r   r   Zaddrsizepermr   r&   Zanonr@   rI   rI   rJ   memory_maps  s6    

zProcess.memory_mapsc                 C   s   t td| j| jf S )Nz%s/%s/fd)r   rF   r   r   r   r   rI   rI   rJ   num_fds  s    zProcess.num_fdsc                 C   s   t jt| j| j S r   )r   ZpctxswrO   Zproc_num_ctx_switchesr   r   r   rI   rI   rJ   num_ctx_switches  s    zProcess.num_ctx_switchesNc                 C   s   t | j|| jS r   )r   Zwait_pidr   r   )r   timeoutrI   rI   rJ   wait  s    zProcess.wait)r   )N)+__name__
__module____qualname____doc__	__slots__r   r   r   r   r   r   r   r   r   r   r   r   rR   r(   r*   r   r   r%   r   r   rn   r   r   r   r   Zmemory_full_infor+   r   r   r   r   r   Znt_mmap_groupedZnt_mmap_extr  r  r  r	  rI   rI   rI   rJ   r   t  s   







	

	
	






 
 


.

r   )F)r   )sr  r   r   rF   r   rP   rV   collectionsr   r   ru   r   r   r   r   r   rO   r	   r
   r   r   r   r   r   r   r   r   r   _compatr   r   r   r   r   Z__extra__all__ZgetpagesizerH   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   r1   r4   r7   r=   Zpfullmemr>   r   _fieldsrA   rK   rd   rn   rj   rq   rr   rs   Zdisk_io_countersrw   rv   Znet_io_countersZnet_if_addrsr   r   r   r   r   r   r   objectr   rI   rI   rI   rJ   <module>   s   

                     

 	&	
!
%