3 ̪ec@sJdZddlZddlZddlZddlZddlZddlZddlmZddlm Z ddl m Z ddl m Z ddl m Zdd l mZdd l mZdd l mZdd l mZdd l mZddl mZddl mZddl mZddl mZddl mZddl mZddl mZddlmZddlmZddlmZddlm Z ddlm!Z!dddgZ"ej#Z$ej%Z%ej&ddkZ'dZ(d Z)ej*e j+ej,e j-ej.e j/ej0e j1ej2e j3ej4e j-ej5e j6iZ7ej8e j9ej:e j;eje j?ej@e jAejBe jCejDe jEejFe jGejHe jIejJe jKejLe jMejNe jOejPe(ejQe)iZReSdddd!d"d#d$d%d&d'd(d)d* ZTed+d,d-d.d/gZUed0d,d-d1d2gZVed3d4d5d6d7d8gZWed9d:d;gZXeXZYedd?gZZed@dAdBj[eZj\Z]dCdDZ^dEdFZ_dGdHZ`dIdJZadKdLZbdMdNZcdOdPZdejeZee jfZfdedRdSZgejhZhejiZidgdTdUZjdVdWZkdXdYZldZd[Zmd\d]Znd^d_Zod`daZpGdbdcdcZqdS)hz'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_BOUND PROCFS_PATH ZIDLEZBOUND ) ppidrssvms create_timenice num_threadsstatusttynruideuidgidegid scputimesusersystemidleZiowait pcputimes children_userchildren_systemsvmemtotalZ availablepercentusedfreepmemr(r) pmmap_groupedpathZ anonymouslocked pmmap_extz addr perms  cCsFtjdt}tjdt}}||}t||dd}t|||||S)zReport virtual memory metrics. SC_PHYS_PAGESSC_AVPHYS_PAGESr)round_)ossysconf PAGE_SIZErr:)r;r>Zavailr=r<rK;/usr/local/lib64/python3.6/site-packages/psutil/_pssunos.pyvirtual_memorys rMcCstj\}}tjddtjdddgtjd}|j\}}trL|j t j j }|j dkrdtd|j |jjd d d }|sd }t|d}}xL|D]D} | j} | d d\} } |tt| d7}|tt| d7}qW||} t| |d d} tj|| || |t|tS)zReport swap memory metrics.z /usr/bin/envzPATH=/usr/sbin:/sbin:%sPATHZswapz-l)stdoutrz'swap -l' failed (retcode=%s) rNzno swap device(s) configuredrr i)rG)cextZswap_mem subprocessPopenrHenvironPIPE communicaterdecodesysrOencoding returncode RuntimeErrorstripsplitintrrsswaprJ)sinsoutprO_linesmsgr;r>linetfr=r<rKrKrL swap_memorys4      ricCstj}tddt|DS)z.Return system-wide CPU times as a named tuple.cSsg|] }t|qSrK)sum).0xrKrKrL szcpu_times..)rQ per_cpu_timesr3zip)retrKrKrL cpu_timessrqcCstj}dd|DS)z6Return system per-CPU times as a list of named tuples.cSsg|] }t|qSrK)r3)rkrlrKrKrLrmsz!per_cpu_times..)rQrn)rprKrKrLrnsrnc Cs$y tjdStk rdSXdS)z0Return the number of logical CPUs in the system.SC_NPROCESSORS_ONLNN)rHrI ValueErrorrKrKrKrLcpu_count_logicals rtcCstjS)z-Return the number of CPU cores in the system.)rQcpu_count_coresrKrKrKrLrusrucCs$tj\}}}}d}tj||||S)z*Return various CPU stats as a named tuple.r)rQ cpu_statsr scpustats) ctx_switches interruptssyscallsZtrapssoft_interruptsrKrKrLrvsrvFc Csg}tj}x|D]}|\}}}}|dkr.d}|sxyt|js@wWn4tk rv}ztd||fwWYdd}~XnXd} } tj||||| | } |j| qW|S)zReturn system disk partitions.nonezskipping %r: %sN) rQdisk_partitions disk_usager;OSErrorr r sdiskpartappend) allretlist partitions partitiondevice mountpointfstypeoptserrmaxfilemaxpathZntuplerKrKrLr~s$   r~c Cstjj}|dkr|jdd||krFtd|djdd|Dftj|\}}tj|}t}x|D]}|\}} } } } } }| |krqj| |krqj| t t fkr| rtj | } | rtj | } t | } t | } t| } |d krtj|| | | | | |}ntj|| | | | | }|j|qjWt|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). runixrz+invalid %r kind argument; choose between %sz, cSsg|] }t|qSrK)repr)rkrlrKrKrLrmsz#net_connections..r)r conn_tmapcopypoprsjoinrQnet_connectionssetrr addr TCP_STATUSESrrsconnpconnaddlist)kind_pidZcmapfamiliestypesrawlistrpitemfdfamtype_laddrraddrr-pidntrKrKrLr s:       rcCsXtj}xJ|jD]>\}}|\}}}}ttdr:tj|}tj||||d||<qW|S)z)Get NIC stats (isup, duplex, speed, mtu). NicDuplexr})rQ net_if_statsitemshasattrrr snicstats)rpnamerisupduplexspeedmturKrKrLr1s   rcCstjS)z:The system boot time expressed in seconds since the epoch.)rQ boot_timerKrKrKrLrAsrc Cs`g}tj}d}xJ|D]B}|\}}}}}} |s0q||kr.)rHlistdirrrrKrKrKrLpids^srcCs tj|S)z&Check for the existence of a unix pid.)r pid_exists)rrKrKrLrcsrcstjfdd}|S)zCall callable into a try/except clause and translate ENOENT, EACCES and EPERM in NoSuchProcess or AccessDenied exceptions. c sy|f||Sttfk rTt|js>t|j|jnt|j|j|jYn\tk rtt |j|jYn<t k r|jdkrdt krt |j|jnYnXdS)Nr) rrrrr _namer _ppidrr rr)selfargskwargs)funrKrLwrapperms   z wrap_exceptions..wrapper) functoolswraps)rrrK)rrLwrap_exceptionshsrc@seZdZdZdddddgZddZd d Zd d Zd dZe e ddZ e e ddZ e e ddZ e ddZe ddZe ddZe ddZe ddZe dd Ze d!d"Ze d#d$Ze d%d&Ze d'd(Ze d)d*Ze d+d,Ze d-d.Ze d/d0Ze d1d2Ze d3d4ZeZe d5d6Ze d7d8Z e d9d:Z!d;d<Z"e dLd>d?Z#e$d@dAZ%e$d@dBZ&e dCdDZ'e dEdFZ(e dGdHZ)e dMdJdKZ*dIS)NProcessz1Wrapper class around underlying C implementation.rrr _procfs_path_cachecCs||_d|_d|_t|_dS)N)rrrrr)rrrKrKrL__init__szProcess.__init__cCstjd|j|jfdS)z+Raise NSP if the process disappeared on us.z%s/%sN)rHstatrr)rrKrKrL _assert_aliveszProcess._assert_alivecCs(|jj||jj||jj|dS)N)_proc_name_and_argscache_activate_proc_basic_info _proc_cred)rrKrKrL oneshot_enters  zProcess.oneshot_entercCs(|jj||jj||jj|dS)N)rcache_deactivaterr)rrKrKrL oneshot_exits  zProcess.oneshot_exitcCstj|j|jS)N)rQZproc_name_and_argsrr)rrKrKrLrszProcess._proc_name_and_argscCsV|jdkr.tjjd|j|jf r.t|jtj|j|j}t|tt ksRt |S)Nrz %s/%s/psinfo) rrHrAexistsrr rQZproc_basic_infolen proc_info_mapAssertionError)rrprKrKrLrs  zProcess._proc_basic_infocCstj|j|jS)N)rQZ proc_credrr)rrKrKrLrszProcess._proc_credcCs |jdS)Nr)r)rrKrKrLrsz Process.namec Cs8ytjd|j|jfStk r*YnX|jdS)Nz%s/%s/path/a.outr})rHreadlinkrrrcmdline)rrKrKrLexesz Process.execCs|jdjdS)NrrD)rr])rrKrKrLrszProcess.cmdlinecCstj|j|jS)N)rQZ proc_environrr)rrKrKrLrTszProcess.environcCs|jtdS)Nr*)rr)rrKrKrLr*szProcess.create_timecCs|jtdS)Nr,)rr)rrKrKrLr,szProcess.num_threadscCs|jtdS)Nr+)rr)rrKrKrLnice_getszProcess.nice_getcCs&|jdkrt|j|jtj|j|S)Nrr)rr)rr r cext_posix setpriority)rvaluerKrKrLnice_sets zProcess.nice_setcCs|jtd|_|jS)Nr')rrr)rrKrKrLr'sz Process.ppidc Cs`y|j\}}}}}}Wn8tk rP|jtd}|jtd}d}YnXtj|||S)Nr/r0)rr rrrpuids)rreal effectivesavedrcrKrKrLuidss z Process.uidsc Cs`y|j\}}}}}}Wn8tk rP|jtd}|jtd}d}YnXtj|||S)Nr1r2)rr rrrr)rrcrrrrKrKrLgidss z Process.gidscCs\ytj|j|j}Wn<tk rP}z |jtjkr>t r>d}nWYdd}~XnXtj |S)N)rrrr) rQZproc_cpu_timesrrrerrno EOVERFLOW IS_64_BITrr7)rtimesrrKrKrLrqszProcess.cpu_timescCstj|j|jS)N)rQZ proc_cpu_numrr)rrKrKrLcpu_numszProcess.cpu_numc Csx|j}d}t|jtd}|tjkrhx>d D]6}ytjd||j|fSt k rbd}w.Yq.Xq.W|rt|j dS) NFr.rrrz %s/%d/path/%dT)rrrr) rrrrrQZPRNODEVrHrrrr)r procfs_path hit_enoentrrlrKrKrLterminals   zProcess.terminalc CsH|j}ytjd||jfStk rBtjd||jfdSXdS)Nz%s/%s/path/cwdz%s/%sr})rrHrrrr)rrrKrKrLcwd*s z Process.cwdcCs2|j}|tdd}|tdd}t||S)Nr(ir))rrr?)rrpr(r)rKrKrL memory_info7szProcess.memory_infocCs|jtd}tj|dS)Nr-?)rr PROC_STATUSESget)rcoderKrKrLr-@szProcess.statusc Cs|j}g}tjd||jf}d}x|D]}t|}ytj|j||\}}WnJtk r}z.|jtj krrt rrw(|jtj krd}w(WYdd}~Xq(Xt j |||} |j| q(W|r|j|S)Nz %s/%d/lwpFT)rrHrrr^rQZquery_process_threadEnvironmentErrorrrrENOENTrpthreadrr) rrrpZtidsrtidutimeZstimerrrKrKrLthreadsFs*  zProcess.threadscCsg}d}|j}d||jf}x~tjd||jfD]f}tjj||}tjj|r2ytj|}Wntk rxd}w2Yq2Xt |r2|j t j |t |q2W|r|j|S)NFz %s/%d/pathz%s/%d/fdT)rrrHrrArislinkrrrrr popenfiler^r)rrrrZpathdirrrAfilerKrKrL open_fileshs" zProcess.open_filesc cs.dt|g}tj|tjtjd}|j\}}trFdd||fD\}}|jdkrd|jkrjt|j |j d|jkrt |j |j t d||f|j d d d }xt|D]v\}}|j}|jd r|j d d d } ||d j} | dkrtj} n| dkr tj} nd} dtj| | dtjfVqWd S)zsz,Process._get_unix_sockets..rzpermission deniedzno such processz%r command error %srPrNzsockname: AF_UNIXrD SOCK_STREAM SOCK_DGRAMrr}rr)strrRrSrUrVrrZlowerr rrr r[r] enumeratelstrip startswithr\socketrrAF_UNIXr CONN_NONE) rrcmdrbrOrrdirfrAtyperKrKrL_get_unix_sockets}s0       zProcess._get_unix_socketsinetcCsPt||jd}|s(tjd|j|jf|dkrL|jdd|j|jD|S)N)rz%s/%srrcSsg|]}tj|qSrK)rr)rkconnrKrKrLrmsz'Process.connections..)rr)rrrHrrextendr)rrrprKrKrL connectionsszProcess.connectionsZmmapzpath rss anon lockedzaddr perms path rss anon lockedc$Cs"dd}|j}g}ytj|j|}Wn:tk r^}z|jtjkrLt rLgSWYdd}~XnXd}x|D]}|\}} } } } } }||| }| jdsyt j d||j| f} WnFtk r}z*|jtj krd||j| f} d}nWYdd}~XnX|j || | | | |fqjW|r|j |S)NcSs0dt|ddjdt|ddjdfS)Nz%s-%srL)hexr\)startendrKrKrLtoaddrsz#Process.memory_maps..toaddrF[z %s/%s/path/%sT)rrQZproc_memory_mapsrrrrrr rHrrrr)rrrrrrrrrZaddrsizeZpermrr(ZanonrBrKrKrL memory_mapss4    zProcess.memory_mapscCsttjd|j|jfS)Nz%s/%s/fd)rrHrrr)rrKrKrLnum_fdsszProcess.num_fdscCstjtj|j|jS)N)rpctxswrQZproc_num_ctx_switchesrr)rrKrKrLnum_ctx_switchesszProcess.num_ctx_switchesNcCstj|j||jS)N)rZwait_pidrr)rtimeoutrKrKrLwaitsz Process.wait)r)N)+__name__ __module__ __qualname____doc__ __slots__rrrrrrrrrrrrrTr*r,rrr'rrrqrrrrZmemory_full_infor-rrrrrZnt_mmap_groupedZ nt_mmap_extrrr r"rKrKrKrLrsT               " "    2  rl)Fr)r)rr&rrrHr rRrX collectionsrrr}rrrrrrQr r r r r rrrrrr_compatrrrrrZ__extra__all__Z getpagesizerJZAF_LINKmaxsizerrrZSSLEEPSTATUS_SLEEPINGZSRUNSTATUS_RUNNINGZSZOMB STATUS_ZOMBIEZSSTOPSTATUS_STOPPEDZSIDL STATUS_IDLEZSONPROCZSWAITSTATUS_WAITINGrZTCPS_ESTABLISHEDCONN_ESTABLISHEDZ TCPS_SYN_SENT CONN_SYN_SENTZ TCPS_SYN_RCVD CONN_SYN_RECVZTCPS_FIN_WAIT_1CONN_FIN_WAIT1ZTCPS_FIN_WAIT_2CONN_FIN_WAIT2ZTCPS_TIME_WAITCONN_TIME_WAITZ TCPS_CLOSED CONN_CLOSEZTCPS_CLOSE_WAITCONN_CLOSE_WAITZ TCPS_LAST_ACK CONN_LAST_ACKZ TCPS_LISTEN CONN_LISTENZ TCPS_CLOSING CONN_CLOSINGZPSUTIL_CONN_NONErZ TCPS_IDLEZ TCPS_BOUNDrdictrr3r7r:r?Zpfullmemr@r_fieldsrCrMrirqrnrtrurvZdisk_io_countersrr~Znet_io_countersZ net_if_addrsrrrrrrrrrKrKrKrLs                             .  " '