a M_c@s8dZddlZddlZddlZddlZddlZddlZddlmZddlm 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!gdZ"e#Z$ej%Z%ej&dkZ'dZ(dZ)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)iZReSddddd d!d"d#d$d%d&d'd( ZTed)gd*ZUed+gd,ZVed-gd.ZWed/d0d1gZXeXZYed2gd3ZZed4d5d6[eZj\Z]d7d8Z^d9d:Z_d;d<Z`d=d>Zad?d@ZbdAdBZcdCdDZdejeZee jfZfdYdFdGZgejhZhejiZidZdIdJZjdKdLZkdMdNZldOdPZmdQdRZndSdTZodUdVZpGdWdXdXeqZrdS)[z'Sun OS Solaris platform implementation.N) namedtuple)AF_INET)_common)_psposix) _psutil_posix) _psutil_sunos) AccessDenied)AF_INET6)debug)get_procfs_path) isfile_strict)memoize_when_activated) NoSuchProcess)sockfam_to_enum)socktype_to_enum) usage_percent) ZombieProcess)b)FileNotFoundError)PermissionError)ProcessLookupError)PY3) CONN_IDLE CONN_BOUNDZ PROCFS_PATHlZIDLEZBOUND ) ppidrssvms create_timenice num_threadsstatusttynruideuidgidegid scputimes)usersystemZidleZiowait pcputimes)r2r3 children_userchildren_systemsvmem)totalZ availablepercentusedfreepmemr&r' pmmap_grouped)pathr&Z anonymouslocked pmmap_extz addr perms  cCsFtdt}tdt}}||}t||dd}t|||||S)zReport virtual memory metrics. SC_PHYS_PAGESSC_AVPHYS_PAGESrZround_)ossysconf PAGE_SIZErr7)r8r;Zavailr:r9rH5/usr/lib64/python3.9/site-packages/psutil/_pssunos.pyvirtual_memory{s rJc Cs t\}}tjddtjdddgtjd}|\}}trL| t j j }|j dkrdtd|j |d d d }|std d}}|D]D}|}|d d\} } |tt| d7}|tt| d7}q||} t| |d d} t|| || |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) configuredrrirD)cextZswap_mem subprocessPopenrEenvironPIPE communicaterdecodesysrLencoding returncode RuntimeErrorstripsplitintrrZsswaprG) ZsinZsoutprLstderrlinesr8r;linetfr:r9rHrHrI swap_memorys6     rbcCst}tddt|DS)z-Return system-wide CPU times as a named tuplecSsg|] }t|qSrH)sum.0xrHrHrI zcpu_times..)rN per_cpu_timesr1zipretrHrHrI cpu_timessrmcCst}dd|DS)z5Return system per-CPU times as a list of named tuplescSsg|] }t|qSrH)r1rdrHrHrIrgrhz!per_cpu_times..)rNrirkrHrHrIrisricCs&z tdWSty YdS0dS)z0Return the number of logical CPUs in the system.SC_NPROCESSORS_ONLNN)rErF ValueErrorrHrHrHrIcpu_count_logicals  rpcCstS)z1Return the number of physical CPUs in the system.)rNZcpu_count_physrHrHrHrIcpu_count_physicalsrqcCs$t\}}}}d}t||||S)z*Return various CPU stats as a named tuple.r)rN cpu_statsrZ scpustats)Z ctx_switchesZ interruptsZsyscallsZtrapsZsoft_interruptsrHrHrIrrs  rrFc Csg}t}|D]}|\}}}}|dkr,d}|szt|js@WqWn@ty}z(td||fWYd}~qWYd}~n d}~00d} } t||||| | } || q|S)zReturn system disk partitions.Znonezskipping %r: %rN) rNdisk_partitions disk_usager8OSErrorr rZ sdiskpartappend) allretlistZ partitions partitionZdeviceZ mountpointZfstypeZoptserrZmaxfileZmaxpathZntuplerHrHrIrts&  "  rtc Cstj}|dkr|dd||vrFtd|ddd|Dftj|\}}t|}t}|D]}|\}} } } } } }| |vrqh| |vrqh| t t fvr| rtj | } | rtj | } t | } t | } t| } |dkrt|| | | | | |}nt|| | | | | }||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|unixrz+invalid %r kind argument; choose between %sz, cSsg|] }t|qSrH)reprrdrHrHrIrgrhz#net_connections..)rZ conn_tmapcopypoprojoinrNnet_connectionssetrr addr TCP_STATUSESrrZsconnpconnaddlist)kind_pidZcmapZfamiliestypesrawlistrlitemfdZfamtype_ZladdrZraddrr+pidntrHrHrIrs:       rcCsRt}|D]<\}}|\}}}}ttdr8t|}t||||||<q|S)z)Get NIC stats (isup, duplex, speed, mtu). NicDuplex)rN net_if_statsitemshasattrrrZ snicstats)rlnamerZisupZduplexZspeedZmturHrHrIr!s   rcCstS)z:The system boot time expressed in seconds since the epoch.)rN boot_timerHrHrHrIr1src Cs\g}t}d}|D]B}|\}}}}}} |s.q||vr:d}t||||| } || q|S)z:Return currently connected users as a list of namedtuples.)z:0.0z:0 localhost)rNusersrZsuserrw) ryrrrr2ttyhostnameZtstampZ user_processrrrHrHrIr6s rcCsddtttDS)z7Returns a list of PIDs currently running on the system.cSsg|]}|rt|qSrH)isdigitr[rdrHrHrIrgPrhzpids..)rElistdirrr rHrHrHrIpidsNsrcCs t|S)z&Check for the existence of a unix pid.)r pid_exists)rrHrHrIrSsrcstfdd}|S)zCall callable into a try/except clause and translate ENOENT, EACCES and EPERM in NoSuchProcess or AccessDenied exceptions. c sz|g|Ri|WSttfyZt|jsDt|j|jnt|j|j|jYnXtyxt |j|jYn:t y|jdkrdt vrt |j|jnYn0dSNr) rrrrr_namer_ppidrr rvr)selfargskwargsfunrHrIwrapper\s     z wrap_exceptions..wrapper) functoolswraps)rrrHrrIwrap_exceptionsXsrc@seZdZdZgdZddZddZddZd d Ze e d d Z e e d dZ e e ddZ e ddZe ddZe 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/d0ZeZe d1d2Ze d3d4Z e d5d6Z!d7d8Z"e dHd:d;Z#e$dZ&e d?d@Z'e dAdBZ(e dCdDZ)e dIdFdGZ*dES)JProcessz1Wrapper class around underlying C implementation.)rrr _procfs_path_cachecCs||_d|_d|_t|_dSN)rrrr r)rrrHrHrI__init__yszProcess.__init__cCstd|j|jfdS)z+Raise NSP if the process disappeared on us.%s/%sN)rEstatrrrrHrHrI _assert_aliveszProcess._assert_alivecCs(|j||j||j|dSr)_proc_name_and_argsZcache_activate_proc_basic_info _proc_credrrHrHrI oneshot_enters  zProcess.oneshot_entercCs(|j||j||j|dSr)rZcache_deactivaterrrrHrHrI oneshot_exits  zProcess.oneshot_exitcCst|j|jSr)rNZproc_name_and_argsrrrrHrHrIrszProcess._proc_name_and_argscCsT|jdkr,tjd|j|jfs,t|jt|j|j}t|tt ksPJ|S)Nrz %s/%s/psinfo) rrEr>existsrr rNZproc_basic_infolen proc_info_map)rrlrHrHrIrs  zProcess._proc_basic_infocCst|j|jSr)rNZ proc_credrrrrHrHrIrszProcess._proc_credcCs |dSr)rrrHrHrIrsz Process.namecCs8ztd|j|jfWSty*Yn0|dS)Nz%s/%s/path/a.outrs)rEreadlinkrrrvcmdlinerrHrHrIexes z Process.execCs|ddS)NrrA)rrZrrHrHrIrszProcess.cmdlinecCst|j|jSr)rNZ proc_environrrrrHrHrIrQszProcess.environcCs|tdS)Nr(rrrrHrHrIr(szProcess.create_timecCs|tdS)Nr*rrrHrHrIr*szProcess.num_threadscCs|tdS)Nr)rrrHrHrInice_getszProcess.nice_getcCs&|jdvrt|j|jt|j|S)N)rr)rr r cext_posix setpriority)rvaluerHrHrInice_sets zProcess.nice_setcCs|td|_|jS)Nr%)rrrrrHrHrIr%sz Process.ppidcCs^z|\}}}}}}Wn6tyN|td}|td}d}Yn0t|||S)Nr-r.rr rrrZpuids)rreal effectivesaved_rHrHrIuidss  z Process.uidscCs^z|\}}}}}}Wn6tyN|td}|td}d}Yn0t|||S)Nr/r0r)rrrrrrHrHrIgidss  z Process.gidsc Cs\zt|j|j}Wn<tyP}z$|jtjkr:ts:d}nWYd}~n d}~00tj |S)N)rrr) rNZproc_cpu_timesrrrverrno EOVERFLOW IS_64_BITrr4)rtimesr{rHrHrIrmszProcess.cpu_timescCst|j|jSr)rNZ proc_cpu_numrrrrHrHrIcpu_numszProcess.cpu_numc Csz|j}d}t|td}|tjkrjdD]<}ztd||j|fWSt yfd}Yq,Yq,0q,|rv| dS)NFr,)rrrz %s/%d/path/%dT) rrrrrNZPRNODEVrErrrr)r procfs_path hit_enoentrrfrHrHrIterminals     zProcess.terminalcCsJ|j}ztd||jfWStyDtd||jfYdS0dS)Nz%s/%s/path/cwdr)rrErrrr)rrrHrHrIcwds  z Process.cwdcCs2|}|tdd}|tdd}t||S)Nr&ir')rrr<)rrlr&r'rHrHrI memory_info#szProcess.memory_infocCs|td}t|dS)Nr+?)rr PROC_STATUSESget)rcoderHrHrIr+,szProcess.statusc Cs|j}g}td||jf}d}|D]}t|}zt|j||\}}Wn^ty}zF|jtj krvt svWYd}~q&|jtj krd}WYd}~q&WYd}~q&d}~00t |||} || q&|r||S)Nz %s/%d/lwpFT)rrErrr[rNZquery_process_threadEnvironmentErrorrrrENOENTrZpthreadrwr) rrrlZtidsrtidutimeZstimer{rrHrHrIthreads2s,     zProcess.threadsc Csg}d}|j}d||jf}td||jfD]f}tj||}tj|r0zt|}Wntyvd}Yq0Yq00t |r0| t |t |q0|r||S)NFz %s/%d/pathz%s/%d/fdT)rrrErr>rislinkrrr rwrZ popenfiler[r)rryrrZpathdirrr>filerHrHrI open_filesSs"   zProcess.open_filesc cs(d|}tj|dtjtjd}|\}}trDdd||fD\}}|jdkrd|vrht|j|j d|vrt |j|j t d ||f| d d d }t |D]v\}}|}|d r| dd d } ||d } | dkrtj} n| dkrtj} nd} dtj| | dtjfVqd S)z.rzpermission deniedzno such processz%r command error %srMrNzsockname: AF_UNIXrA SOCK_STREAM SOCK_DGRAMr|rs)rOrPrRrSrrWlowerr rrrrXrZ enumeratelstrip startswithrYsocketrrZAF_UNIXr CONN_NONE) rrcmdr\rLr]r^ir_r>typerHrHrI_get_unix_socketshs6        zProcess._get_unix_socketsinetcCsPt||jd}|s(td|j|jf|dvrL|dd||jD|S)N)rr)rxr}cSsg|]}tj|qSrH)rr)reZconnrHrHrIrgrhz'Process.connections..)rrrErrextendr)rrrlrHrHrI connectionss  zProcess.connectionsZmmapzpath rss anon lockedzaddr perms path rss anon lockedc Cs0dd}|j}g}zt|j|}WnFtyj}z.|jtjkrTtsTgWYd}~SWYd}~n d}~00d}|D]}|\}} } } } } }||| }| dszt d||j| f} WnJty}z0|jtj krd||j| f} d}nWYd}~n d}~00| || | | | |fqt|r,| |S)NcSs0dt|dddt|dddfS)Nz%s-%srL)hexrY)startendrHrHrItoaddrsz#Process.memory_maps..toaddrF[z %s/%s/path/%sT)rrNZproc_memory_mapsrrvrrrrrErrrwr)rrrryrr{rrrZaddrsizeZpermrr&Zanonr?rHrHrI memory_mapss6   zProcess.memory_mapscCsttd|j|jfS)Nz%s/%s/fd)rrErrrrrHrHrInum_fdsszProcess.num_fdscCstjt|j|jSr)rZpctxswrNZproc_num_ctx_switchesrrrrHrHrInum_ctx_switchesszProcess.num_ctx_switchesNcCst|j||jSr)rZwait_pidrr)rtimeoutrHrHrIwaitsz Process.wait)r)N)+__name__ __module__ __qualname____doc__ __slots__rrrrrrrrrrrrrQr(r*rrr%rrrmrrrrZmemory_full_infor+rrrrrZnt_mmap_groupedZ nt_mmap_extrrrrrHrHrHrIrts                           .  r)F)r|)srrrrErrOrU collectionsrrrsrrrrrrNr r r r r rrrrrrZ_compatrrrrrZ__extra__all__Z getpagesizerGZAF_LINKmaxsizerrrZSSLEEPZSTATUS_SLEEPINGZSRUNZSTATUS_RUNNINGZSZOMBZ STATUS_ZOMBIEZSSTOPZSTATUS_STOPPEDZSIDLZ STATUS_IDLEZSONPROCZSWAITZSTATUS_WAITINGrZTCPS_ESTABLISHEDZCONN_ESTABLISHEDZ TCPS_SYN_SENTZ CONN_SYN_SENTZ TCPS_SYN_RCVDZ CONN_SYN_RECVZTCPS_FIN_WAIT_1ZCONN_FIN_WAIT1ZTCPS_FIN_WAIT_2ZCONN_FIN_WAIT2ZTCPS_TIME_WAITZCONN_TIME_WAITZ TCPS_CLOSEDZ CONN_CLOSEZTCPS_CLOSE_WAITZCONN_CLOSE_WAITZ TCPS_LAST_ACKZ CONN_LAST_ACKZ TCPS_LISTENZ CONN_LISTENZ TCPS_CLOSINGZ CONN_CLOSINGZPSUTIL_CONN_NONErZ TCPS_IDLEZ TCPS_BOUNDrdictrr1r4r7r<Zpfullmemr=r_fieldsr@rJrbrmrirprqrrZdisk_io_countersrurtZnet_io_countersZ net_if_addrsrrrrrrrobjectrrHrHrHrIs                          &   ! %