a MÝ_jfã @s"dZddlmZmZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl mZddl mZddlmZddlmZddlmZzdd lmZWney¾dZYn0zdd lmZWneyædZYn0e jd krüddlZndZe jdd kZgd ¢ZejdkZejdkZe j d¡Ze j d¡Z e Z!e j d¡Z"e j d¡Z#e j d¡Z$e"pxe#pxe$Z%e j d¡Z&e j d¡Z'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0d Z1d!Z2d"Z3d#Z4d$Z5d%Z6d&Z7d'Z8d(Z9d)Z:d*Z;d+Zd.Z?d/Z@d0ZAedurd1ZBd2ZCdZDn Gd3d4„d4ejEƒZFeGƒ HeFjI¡edurFd5ZJd6ZKn Gd7d8„d8ejEƒZLeGƒ HeLjI¡e  M¡ZNeszd9ZOn0z e  P¡ZOWn"eQy¨er d:nd9ZOYn0ed;gd<¢ƒZRed=gd>¢ƒZSed?gd@¢ƒZTedAgdB¢ƒZUedCgdD¢ƒZVedEgdF¢ƒZWedGgdH¢ƒZXedIgdJ¢ƒZYedKgdL¢ƒZZedMgdN¢ƒZ[edOgdP¢ƒZ\edQgdR¢ƒZ]edSgdT¢ƒZ^edUdVdWgƒZ_edXgdY¢ƒZ`edZd[d\gƒZaed]gd^¢ƒZbed_gd`¢ƒZcedagd`¢ƒZdedbgdc¢ƒZeedddedfgƒZfedgdhdigƒZgedjgdk¢ƒZhedldmdngƒZieeegeegfeegegfegegfeegegfegegfeegeegfegeegfegeegfdoœZjedurŒej Hegegfegegfdpœ¡edur®ej Hdqegeegfi¡Gdrds„dsekƒZlGdtdu„duelƒZmGdvdw„dwemƒZnGdxdy„dyelƒZoGdzd{„d{elƒZpd­d|d}„Zqd~d„Zrd€d„Zsd‚dƒ„Ztd„d…„Zuerd†d‡„ƒZvdˆd‰„ZwdŠd‹„ZxdŒd„Zyd®dŽd„Zzdd‘„Z{Gd’d“„d“ƒZ|d”d•„Z}e|ƒZ~e~je}_e~j€e}_€d–d—„Zd˜d™„Z‚d¯d›dœ„Zƒddž„Z„er¼dŸd „Z…nd¡d „Z…ere j†fd¢d£„ƒZ‡d°d¥d¦„Zˆdd¤e j†fd§d¨„Z‰eŠe ‹d©d¡ƒrddlŒZŒdªd«„Znd¬d«„ZdS)±z9Common objects shared by __init__.py and _ps*.py modules.é)ÚdivisionÚprint_functionN)Ú defaultdict)Ú namedtuple)ÚAF_INET)Ú SOCK_DGRAM)Ú SOCK_STREAM)ÚAF_INET6)ÚAF_UNIX)éér )NÚFREEBSDÚBSDÚLINUXÚNETBSDÚOPENBSDÚMACOSÚOSXÚPOSIXÚSUNOSÚWINDOWSÚ CONN_CLOSEÚCONN_CLOSE_WAITÚ CONN_CLOSINGÚCONN_ESTABLISHEDÚCONN_FIN_WAIT1ÚCONN_FIN_WAIT2Ú CONN_LAST_ACKÚ CONN_LISTENÚ CONN_NONEÚ CONN_SYN_RECVÚ CONN_SYN_SENTÚCONN_TIME_WAITÚNIC_DUPLEX_FULLÚNIC_DUPLEX_HALFÚNIC_DUPLEX_UNKNOWNÚ STATUS_DEADÚSTATUS_DISK_SLEEPÚ STATUS_IDLEÚ STATUS_LOCKEDÚSTATUS_RUNNINGÚSTATUS_SLEEPINGÚSTATUS_STOPPEDÚSTATUS_SUSPENDEDÚSTATUS_TRACING_STOPÚSTATUS_WAITINGÚSTATUS_WAKE_KILLÚ STATUS_WAKINGÚ STATUS_ZOMBIEÚ STATUS_PARKEDÚENCODINGÚ ENCODING_ERRSr ÚpconnÚ pcputimesÚpctxswÚpgidsÚpioÚpioniceÚ popenfileÚpthreadÚpuidsÚsconnÚ scpustatsÚsdiskioÚ sdiskpartÚ sdiskusageÚsnetioÚsnicaddrÚ snicstatsÚsswapÚsuserÚ conn_tmapÚdeprecated_methodÚ isfile_strictÚmemoizeÚparse_environ_blockÚpath_exists_strictÚ usage_percentÚ supports_ipv6Úsockfam_to_enumÚsocktype_to_enumÚ wrap_numbersÚ bytes2humanÚconn_to_ntupleÚdebugÚhiliteÚterm_supports_colorsÚ print_colorÚposixÚntZlinuxÚdarwinZfreebsdZopenbsdZnetbsd)ZsunosZsolarisZaixZrunningZsleepingz disk-sleepÚstoppedz tracing-stopZzombieZdeadz wake-killZwakingZidleÚlockedZwaitingZ suspendedZparkedZ ESTABLISHEDZSYN_SENTZSYN_RECVZ FIN_WAIT1Z FIN_WAIT2Z TIME_WAITZCLOSEZ CLOSE_WAITZLAST_ACKZLISTENZCLOSINGZNONEééc@seZdZdZdZdZdS)Ú NicDuplexr_r`rN)Ú__name__Ú __module__Ú __qualname__r#r$r%©rereú4/usr/lib64/python3.9/site-packages/psutil/_common.pyra‡sraéÿÿÿÿéþÿÿÿc@seZdZdZdZdS)Ú BatteryTimergrhN)rbrcrdÚPOWER_TIME_UNKNOWNÚPOWER_TIME_UNLIMITEDrerererfri“sriÚreplaceÚsurrogateescaperG)ÚtotalÚusedÚfreeÚpercentZsinZsoutrC)rnrorprqrA)Ú read_countÚ write_countÚ read_bytesÚ write_bytesZ read_timeZ write_timerB)ZdeviceZ mountpointZfstypeZoptsZmaxfileZmaxpathrD)Z bytes_sentZ bytes_recvZ packets_sentZ packets_recvZerrinZerroutZdropinZdropoutrH)ÚnameZterminalÚhostÚstartedÚpidr?)ÚfdÚfamilyÚtypeÚladdrÚraddrÚstatusryrE)r{ZaddressZnetmaskZ broadcastZptprF)ZisupZduplexZspeedZmtur@)Z ctx_switchesZ interruptsZsoft_interruptsZsyscallsÚscpufreq)ÚcurrentÚminÚmaxÚshwtemp)ÚlabelrZhighZcriticalÚsbattery)rqZsecsleftZ power_pluggedÚsfanr…rr7)ÚuserÚsystemÚ children_userÚchildren_systemr<Úpathrzr=)ÚidZ user_timeZ system_timer>)ÚrealZ effectiveZsavedr9r:)rrrsrtrur;ZioclassÚvaluer8Z voluntaryZ involuntaryr6)rzr{r|r}r~rÚaddrZipÚport)ÚallZtcpZtcp4ZudpZudp4ZinetZinet4Zinet6)Ztcp6Zudp6Zunixc@s*eZdZdZdZd dd„Zdd„ZeZdS) ÚErrorzQBase exception class. All other psutil exceptions inherit from this one. ÚpsutilÚcCst ||¡||_dS©N)Ú ExceptionÚ__init__Úmsg)Úselfr™rererfr˜s zError.__init__cCsd|jj|jf}| ¡S)Nz psutil.%s %s)Ú __class__rbr™Ústrip©ršÚretrererfÚ__repr__szError.__repr__N)r•)rbrcrdÚ__doc__r˜rŸÚ__str__rerererfr“s  r“c@seZdZdZdZddd„ZdS)Ú NoSuchProcesszXException raised when a process with a certain PID doesn't or no longer exists. r”NcCsXt ||¡||_||_||_|durT|r@d|jt|jƒf}n d|j}d||_dS)Nú(pid=%s, name=%s)ú(pid=%s)zprocess no longer exists ©r“r˜ryrvr™Úrepr)ršryrvr™Údetailsrererfr˜'s  zNoSuchProcess.__init__)NN©rbrcrdr r˜rerererfr¢!sr¢c@seZdZdZdZddd„ZdS)Ú ZombieProcessa1Exception raised when querying a zombie process. This is raised on macOS, BSD and Solaris only, and not always: depending on the query the OS may be able to succeed anyway. On Linux all zombie processes are querable (hence this is never raised). Windows doesn't have zombie processes. r”NcCs~t ||¡||_||_||_||_|durzd|g}|rN| dt|jƒ¡|rb| d|j¡dd |¡}d||_dS)Nzpid=%szname=%szppid=%sz(%s)z, z'process still exists but it's a zombie ) r¢r˜ryÚppidrvr™Úappendr¦Újoin)ršryrvrªr™Úargsr§rererfr˜=s  zZombieProcess.__init__)NNNr¨rerererfr©4sr©c@seZdZdZdZddd„ZdS)Ú AccessDeniedz@Exception raised when permission to perform an action is denied.r”NcCsjt ||¡||_||_||_|durf|durJ|durJd|t|ƒf|_n|dur`d|j|_nd|_dS)Nr£r¤r•r¥)ršryrvr™rererfr˜Qs zAccessDenied.__init__)NNNr¨rerererfr®Msr®c@seZdZdZdZddd„ZdS)ÚTimeoutExpiredzWRaised on Process.wait(timeout) if timeout expires and process is still alive. r”NcCsnt |d|¡||_||_||_|durN|durN|jd|t|ƒf7_n|durj|jd|j7_dS)Nztimeout after %s secondsz (pid=%s, name=%s)z (pid=%s))r“r˜Úsecondsryrvr™r¦)ršr°ryrvrererfr˜eszTimeoutExpired.__init__)NNr¨rerererfr¯_sr¯cCsDzt|ƒ|d}Wnty(YdS0|dur>> @memoize ... def foo() ... return 1 ... >>> foo() 1 >>> foo.cache_clear() >>> csP|tt| ¡ƒƒf}z ˆ|WStyJˆ|i|¤Ž}ˆ|<|YS0dSr–)Ú frozensetÚsortedÚitemsÚKeyError)r­ÚkwargsÚkeyrž©ÚcacheÚfunrerfÚwrappers   zmemoize..wrappercs ˆ ¡dS)z Clear cache.N)Úclearre)r¼rerfÚ cache_clear˜szmemoize..cache_clear)Ú functoolsÚwrapsrÀ)r½r¾rÀrer»rfrLs  rLcs6t ˆ¡‡fdd„ƒ}dd„}dd„}||_||_|S)aúA memoize decorator which is disabled by default. It can be activated and deactivated on request. For efficiency reasons it can be used only against class methods accepting no arguments. >>> class Foo: ... @memoize ... def foo() ... print(1) ... >>> f = Foo() >>> # deactivated (default) >>> foo() 1 >>> foo() 1 >>> >>> # activated >>> foo.cache_activate(self) >>> foo() 1 >>> foo() >>> foo() >>> csPz|jˆ}Wn<ty(ˆ|ƒYStyJˆ|ƒ}|jˆ<Yn0|Sr–)Ú_cacheÚAttributeErrorr¸r©r½rerfr¾»s   z'memoize_when_activated..wrappercSs i|_dS)zjActivate cache. Expects a Process instance. Cache will be stored as a "_cache" instance attribute.N)réÚprocrererfÚcache_activateÉsz.memoize_when_activated..cache_activatecSs z|`WntyYn0dS)zDeactivate and clear cache.N)rÃrÄrÆrererfÚcache_deactivateÎs z0memoize_when_activated..cache_deactivate)rÁrÂrÈrÉ)r½r¾rÈrÉrerÅrfÚmemoize_when_activated¡s rÊc CsZzt |¡}Wn:tyH}z"|jtjtjfvr2‚WYd}~dSd}~00t |j¡SdS)zœSame as os.path.isfile() but does not swallow EACCES / EPERM exceptions, see: http://mail.python.org/pipermail/python-dev/2012-June/120787.html NF)ÚosÚstatÚOSErrorÚerrnoÚEPERMÚEACCESÚS_ISREGÚst_mode)rŒÚstÚerrrererfrKÚsrKc CsRzt |¡Wn:tyH}z"|jtjtjfvr2‚WYd}~dSd}~00dSdS)zœSame as os.path.exists() but does not swallow EACCES / EPERM exceptions, see: http://mail.python.org/pipermail/python-dev/2012-June/120787.html NFT)rËrÌrÍrÎrÏrÐ)rŒrÔrererfrNésrNcCsvtjrtdurdSzHt ttj¡}t |¡| d¡Wdƒn1sL0YWdStjypYdS0dS)z2Return True if IPv6 is supported on this platform.NF)z::1rT)ÚsocketZhas_ipv6r rÚ contextlibÚclosingZbindÚerror)ZsockrererfrPøs (rPcCsvi}d}t}| d|¡}||kr"qr| d||¡}||krh|||…}||d|…}|r`| ¡}|||<|d}q |S)zCParse a C environ block of environment variables into a dictionary.rúú=r`)rÚfindÚupper)ÚdataržÚposZWINDOWS_Znext_posZ equal_posrºrrererfrMs   rMcCs4tdur |Sz t |¡WSty.|YS0dS)zConvert a numeric socket family value to an IntEnum member. If it's not a known member, return the numeric value itself. N)ÚenumrÕZ AddressFamilyÚ ValueError©ZnumrererfrQ"s   rQcCs4tdur |Sz t |¡WSty.|YS0dS)zConvert a numeric socket type value to an IntEnum member. If it's not a known member, return the numeric value itself. N)rßrÕZ SocketKindràrárererfrR/s   rRcCs|tjtfvr&|rt|Ž}|r&t|Ž}|tjkrJ|ttfvrJ| |t¡}nt}t|ƒ}t|ƒ}|durxt ||||||ƒSt |||||||ƒSdS)z2Convert a raw connection tuple to a proper ntuple.N) rÕrr rrÚgetrrQrRr6r?)rzZfamÚtype_r}r~rZ status_mapryrererfrU<srUcs‡fdd„}|S)zƒA decorator which can be used to mark a method as deprecated 'replcement' is the method name which will be called instead. cs:d|jˆf‰|jdurˆ|_t |¡‡‡fdd„ƒ}|S)Nz8%s() is deprecated and will be removed; use %s() insteadcs$tjˆtddt|ˆƒ|i|¤ŽS)Nr_)ÚcategoryÚ stacklevel)ÚwarningsÚwarnÚDeprecationWarningÚgetattr)ršr­r¹)r™Ú replacementrerfÚinnerYsz/deprecated_method..outer..inner)rbr rÁrÂ)r½rë©rê©r™rfÚouterSsÿ z deprecated_method..outerre)rêrîrerìrfrJOs rJc@sBeZdZdZdd„Zdd„Zdd„Zdd „Zdd d „Zd d„Z d S)Ú _WrapNumberszNWatches numbers so that they don't overflow and wrap (reset to zero). cCs t ¡|_i|_i|_i|_dSr–)Ú threadingÚLockÚlockr¼Ú remindersÚ reminder_keys©ršrererfr˜fs z_WrapNumbers.__init__cCsT||jvsJ‚||jvsJ‚||jvs*J‚||j|<ttƒ|j|<ttƒ|j|<dSr–)r¼rórôrÚintÚset)ršÚ input_dictrvrererfÚ _add_dictls  z_WrapNumbers._add_dictcCs\|j|}t| ¡ƒt| ¡ƒ}|D]0}|j||D]}|j||=q8|j||=q&dS)z†In case the number of keys changed between calls (e.g. a disk disappears) this removes the entry from self.reminders. N)r¼r÷Úkeysrôró)ršrørvÚold_dictZ gone_keysZgone_keyÚremkeyrererfÚ_remove_dead_remindersts  z#_WrapNumbers._remove_dead_remindersc Cs||jvr| ||¡|S| ||¡|j|}i}| ¡D]¼}||}z ||}Wntyr|||<YqClear the internal cache, optionally only for function 'name'.N)ròr¼r¿rórôÚpop)ršrvrererfrÀ¦s   z_WrapNumbers.cache_clearcCs:|j |j|j|jfWdƒS1s,0YdS)z5Return internal cache dicts as a tuple of 3 elements.N)ròr¼rórôrõrererfÚ cache_info²sz_WrapNumbers.cache_info)N) rbrcrdr r˜rùrýrrÀrrerererfrïas ' rïcCs6tjt ||¡WdƒS1s(0YdS)zÅGiven an `input_dict` and a function `name`, adjust the numbers which "wrap" (restart from zero) across different calls by adding "old value" to "new value" and return an updated dict. N)Ú_wnròr)rørvrererfrS¸srScKst|dfi|¤ŽS)NÚrb)Úopen©Úfnamer¹rererfÚ open_binaryÆsr cKs.tr| dt¡| dt¡t|dfi|¤ŽS)z¨On Python 3 opens a file in text mode by using fs encoding and a proper en/decoding errors handler. On Python 2 this is just an alias for open(name, 'rt'). ÚencodingÚerrorsZrt)ÚPY3Ú setdefaultr4r5r r rererfÚ open_textÊs  rú%(value).1f%(symbol)scCsŠd}i}t|dd…ƒD]\}}d|dd>||<qt|dd…ƒD].}|||krFt|ƒ||}|tƒSqF|t|d|dS)zŒUsed by various scripts. See: http://goo.gl/zeJZl >>> bytes2human(10000) '9.8K' >>> bytes2human(100001221) '95.4M' ) ÚBÚKÚMÚGÚTÚPÚEÚZÚYr`Né r)Úsymbolr)Ú enumerateÚreversedr²ÚlocalsÚdict)ÚnÚformatZsymbolsÚprefixrÚsrrrererfrTØs  rTcCs tjdjS)z+Return updated psutil.PROCFS_PATH constant.r”)ÚsysÚmodulesZ PROCFS_PATHrerererfÚget_procfs_pathìsr)cCs|jttdS)N)rr)Údecoder4r5©r&rererfr*òsr*cCs|Sr–rer+rererfr*õscCs^tjdkrdSz2ddl}| ¡s$J‚| ¡| d¡dks>J‚WntyTYdS0dSdS)Nr[TrÚcolorsF)rËrvÚcursesÚisattyZ setuptermZtigetnumr—)Úfiler-rererfrXþs   rXFc CsŽtƒs |Sg}tddddddddd d }d |d <z ||}Wn&tybtd t| ¡ƒƒ‚Yn0| |¡|r|| d¡dd |¡|fS)z*Return an highlighted version of 'string'.Z32Z91Z33Z93Z34Z35Z36Z37Z30) ÚgreenÚredÚbrownÚyellowZblueZvioletZ lightblueZgreyZdarkgreyZ29Nz#invalid color %r; choose between %sÚ1z [%sm%sú;)rXr"r¸ràÚlistrúr«r¬)r&ÚcolorÚboldÚattrr,rererfrW s" ÿ   ÿ   rWc Cs tƒst||dnòtr.tt|||ƒ|dnØddl}d}|jjj}|jjj}t ddddd}||d<z ||}Wn*t yœt d |t |  ¡ƒfƒ‚Yn0|r²|dkr²|d 7}|tjurÀd nd } |j|_|| ƒ} || |ƒzt||dW|| |ƒn || |ƒ0dS) z$Print a colorized version of string.©r/rNér_r é)r0r1r2r3z#invalid color %r; choose between %réiôÿÿÿiõÿÿÿ)rXÚprintrrWÚctypesZwindllZKernel32Ú GetStdHandleÚSetConsoleTextAttributer"r¸ràr6rúr'ÚstderrZc_ulongZrestype) r&r7r8r/r?Z DEFAULT_COLORr@rAr,Z handle_idZhandlerererfrY s4 ÿ   ÿ  rYZ PSUTIL_DEBUGcCs6t t ¡j¡\}}}}}td|||ftjddS)z@If PSUTIL_DEBUG env var is set, print a debug message to stderr.zpsutil-debug [%s:%s]> %sr:N)ÚinspectZ getframeinfoZ currentframeÚf_backr>r'rB)r™r ÚlinenoZ func_nameÚlinesÚindexrererfrVFs ÿÿrVcCsdSr–rerírererfrVMs)N)N)r)NF)Žr Z __future__rrrÖrÎrÁrËrÕrÌr'rðræÚ collectionsrrrrrr Ú ImportErrorr Ú version_inforßrÚ__all__rvrrÚplatformÚ startswithrrrr rrrrZAIXr*r+r'r,r.r2r&r0r1r(r)r/r-r3rr!r rrr"rrrrrrr#r$r%ÚIntEnumraÚglobalsÚupdateÚ __members__rjrkriÚgetfilesystemencodingr4r5ÚgetfilesystemencodeerrorsrÄrGrCrArBrDrHr?rErFr@r€r„r†r‡r7r<r=r>r9r:r;r8r6rrIr—r“r¢r©r®r¯rOrLrÊrKrNrPrMrQrRrUrJrïrSrrÀrr rrTr)r*ÚstdoutrXrWrYÚboolÚgetenvrCrVrerererfÚsV           $             ÿÿÿÿ       ø   þ ÿ   9   W     ÿ #