if dZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddlm Z ddlm Z ddlm Z  ddlm Z n #e$rdZ YnwxYw ddlmZn #e$rdZYnwxYweejdZeZgd Zejd kZejd kZejd Zejd ZeZejdZejdZejdZ epepe Z!ejdZ"ejdZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0d Z1d!Z2d"Z3d#Z4d$Z5d%Z6d&Z7d'Z8d(Z9d)Z:d*Z;d+ZZ?e@Ae?jBGd/d0ej>ZCe@AeCjBejDZEejFZGe e ege e gfe e ge gfe ge gfe e ge gfe ge gfe e ge e gfe ge e gfe ge e gfd1ZHe eHAe ge gfe ge gfd2ee"seHAd3ege e gfiGd4d5eIZJGd6d7eJZKGd8d9eKZLGd:d;eJZMGd<d=eJZNd[d>ZOd?ZPd@ZQdAZRdBZSdCZTdDZUdEZVdFZWd[dGZXdHZYdIZZGdJdKZ[dLZ\e[Z]e]j^e\_^e]j_e\__dMZ`dNZadOZbeebfdPZcefdQZdd\dSZedTZfdUZgePejhfdVZid]dXZjddWejhfdYZkdZZldS)^zCommon objects shared by __init__.py and _ps*.py modules. Note: this module is imported by setup.py, so it should not import psutil or third-party modules. N)AF_INET) SOCK_DGRAM) SOCK_STREAM)AF_INET6)AF_UNIX PSUTIL_DEBUG)?FREEBSDBSDLINUXNETBSDOPENBSDMACOSOSXPOSIXSUNOSWINDOWS CONN_CLOSECONN_CLOSE_WAIT CONN_CLOSINGCONN_ESTABLISHEDCONN_FIN_WAIT1CONN_FIN_WAIT2 CONN_LAST_ACK CONN_LISTEN CONN_NONE CONN_SYN_RECV CONN_SYN_SENTCONN_TIME_WAITNIC_DUPLEX_FULLNIC_DUPLEX_HALFNIC_DUPLEX_UNKNOWN STATUS_DEADSTATUS_DISK_SLEEP STATUS_IDLE STATUS_LOCKEDSTATUS_RUNNINGSTATUS_SLEEPINGSTATUS_STOPPEDSTATUS_SUSPENDEDSTATUS_TRACING_STOPSTATUS_WAITINGSTATUS_WAKE_KILL STATUS_WAKING STATUS_ZOMBIE STATUS_PARKEDENCODING ENCODING_ERRSr conn_tmapdeprecated_method isfile_strictmemoizeparse_environ_blockpath_exists_strict usage_percent supports_ipv6sockfam_to_enumsocktype_to_enum wrap_numbers open_text open_binarycatbcat bytes2humanconn_to_ntupledebughiliteterm_supports_colors print_colorposixntlinuxdarwin)freebsd midnightbsdopenbsdnetbsd)sunossolarisaixrunningsleepingz disk-sleepstoppedz tracing-stopzombiedeadz wake-killwakingidlelockedwaiting suspendedparked ESTABLISHEDSYN_SENTSYN_RECV FIN_WAIT1 FIN_WAIT2 TIME_WAITCLOSE CLOSE_WAITLAST_ACKLISTENCLOSINGNONEceZdZdZdZdZdS) NicDuplexrN)__name__ __module__ __qualname__rr r!z!Error.__str__..s&AAADAqa<.sMMMq1MMMMrqmsg)rformatjoinitemsrrrdetailss rr__str__z Error.__str__s~~566  mm AADJJLLAAABBGGGxxMMWT5"%=%=w$GMMMNNNrqc|d}dd|D}d|jjd|dS)N)rrrsecondsrrc"g|] \}}|d| Srrprs rrrz"Error.__repr__..s&CCCda\\A\\CCCrqzpsutil.())rrr __class__rmrs rr__repr__zError.__repr__sZ~~GHH))CCdjjllCCCDD=0==7====rqN)rmrnro__doc__rrrrprqrrrrsUJ O O O>>>>>rqrc$eZdZdZdZddZdZdS) NoSuchProcesszXException raised when a process with a certain PID doesn't or no longer exists. rNcht|||_||_|pd|_dS)Nzprocess no longer existsr__init__rrrrrrrs rrrzNoSuchProcess.__init__s3 t 44rqc8|j|j|j|jffSNrrrrrs rr __reduce__zNoSuchProcess.__reduce__49dh ?@@rqNNrmrnrorrrrprqrrrrsMJ5555 AAAAArqrc$eZdZdZdZddZdZdS) 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. rNc`t||||||_|pd|_dS)Nz"PID still exists but it's a zombie)rrrr)rrrrrs rrrzZombieProcess.__init__s4tS$444 >>rqcD|j|j|j|j|jffSr)rrrrrrs rrrzZombieProcess.__reduce__s 49di JKKrqNNNrrprqrrrrsMJ???? LLLLLrqrc$eZdZdZdZddZdZdS) AccessDeniedz@Exception raised when permission to perform an action is denied.rNcht|||_||_|pd|_dS)Nrrrs rrrzAccessDenied.__init__s1 t 9"rqc8|j|j|j|jffSrrrs rrrzAccessDenied.__reduce__rrqrrrprqrrrrsGJJJ AAAAArqrc$eZdZdZdZddZdZdS)TimeoutExpiredzWRaised on Process.wait(timeout) if timeout expires and process is still alive. rNczt|||_||_||_d|d|_dS)Nztimeout after z seconds)rrrrrr)rrrrs rrrzTimeoutExpired.__init__ s? t  5G555rqc8|j|j|j|jffSr)rrrrrs rrrzTimeoutExpired.__reduce__stx CDDrqrrrprqrrrrsMJ6666EEEEErqrcx t||z dz}|t||}|S#t$rYdSwxYw)z5Calculate percentage usage of 'used' against 'total'.dNg)floatroundZeroDivisionError)usedtotalround_rets rrr8r8s\T{{U"c)  V$$C sss + 99cftjfd}fd}i||_|S)aA simple memoize decorator for functions supporting (hashable) positional arguments. It also provides a cache_clear() function for clearing the cache: >>> @memoize ... def foo() ... return 1 ... >>> foo() 1 >>> foo.cache_clear() >>> It supports: - functions - classes (acts as a @singleton) - staticmethods - classmethods It does NOT support: - methods c|tt|f} |S#t$r) |i|x}|<n#t$r}|dd}~wwxYw|cYSwxYwr) frozensetsortedrKeyError Exception)argskwargskeyrerrcachefuns rrwrapperzmemoize..wrapper?sYvfllnn55667 :     $#&3#7#7#77eCjj $ $ $t# $JJJ  s3; A. AA. A&A!!A&&A.-A.c0dS)z Clear cache.N)clear)rsrr cache_clearzmemoize..cache_clearKs rq) functoolswrapsr)rrrrs` @rrr5r5'sf0_S       E%G Nrqcntjfd}d}d}||_||_|S)aA 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() >>> c |j}nz#t$r$ |cYS#t$r}|dd}~wwxYwt$rA |}n#t$r}|dd}~wwxYw ||j<n#t$rYnwxYwYnwxYw|Sr)_cacheAttributeErrorrr)rrrrs rrrz'memoize_when_activated..wrapperos +c"CC $ $ $ $s4yy    $ $ $t# $    $c$ii $ $ $t# $ #& C  !      sq  B )B ;6; B AB A&A!!A&&B* A54B5 B?BBBBci|_dS)zsActivate cache. Expects a Process instance. Cache will be stored as a "_cache" instance attribute. N)rprocs rrcache_activatez.memoize_when_activated..cache_activates rqc. |`dS#t$rYdSwxYw)zDeactivate and clear cache.N)rrrs rrcache_deactivatez0memoize_when_activated..cache_deactivates2      DD s  )rrrr)rrrrs` rrmemoize_when_activatedrTsh6_S2 ,G/G Nrqc tj|}tj|jS#t$rt $rYdSwxYw)zSame as os.path.isfile() but does not swallow EACCES / EPERM exceptions, see: http://mail.python.org/pipermail/python-dev/2012-June/120787.html. F)osstatS_ISREGst_modePermissionErrorOSError)pathsts rrr4r4sa ( WT]] |BJ'''  uus/AAcf tj|dS#t$rt$rYdSwxYw)zSame as os.path.exists() but does not swallow EACCES / EPERM exceptions. See: http://mail.python.org/pipermail/python-dev/2012-June/120787.html. TF)rrrr)rs rrr7r7sT   t  uus 00ctjrtdS tjttj5}|ddddn #1swxYwYdS#t $rYdSwxYw)z2Return True if IPv6 is supported on this platform.NF)z::1rT)sockethas_ipv6rrbindr)socks rrr9r9s ?h.u ]8V%7 8 8 "D IIj ! ! ! " " " " " " " " " " " " " " "t uus4$A*A A*A!!A*$A!%A** A87A8ci}d}t} |d|}||krnU|d||}||kr2|||}||dz|}|r|}|||<|dz}r|S)zCParse a C environ block of environment variables into a dictionary.rTrrl)rfindupper)datarposWINDOWS_next_pos equal_posrrs rrr6r6s C CH99T3'' s?? IIc311 s??s9}%CQ12E "iikkCHl JrqcP tj|S#t$r|cYSwxYw)zConvert a numeric socket family value to an IntEnum member. If it's not a known member, return the numeric value itself. )r AddressFamily ValueErrornums rrr:r:s<#C(((    %%cP tj|S#t$r|cYSwxYw)zConvert a numeric socket type value to an IntEnum member. If it's not a known member, return the numeric value itself. )r SocketKindr r s rrr;r;s< %%%  rc ddlm}|tjthvr|r |j|}|r |j|}|tjkr,|tthvr||t}nt}t|}t|}|| ||||||S| |||||||S)z2Convert a raw connection tuple to a proper ntuple.rl)_ntuples) rrrrraddrrgetrr:r;pconnsconn) fdfamtype_laddrraddrstatus status_maprntps rrrBrBs!!!!!! v~x(((  %CHe$E  %CHe$E """sw.A'A'A 22 #  C U # #E {yyS%v>>>yyS%vsCCCrqcbddl}|jr|jsdS|jtjkr8t ||jd|jdjS|jtj kr8t | |jd|jdjSdS)zbGiven the address ntuple returned by ``net_if_addrs()`` calculates the broadcast address. rN/F)strict) ipaddressaddressnetmaskfamilyrrstr IPv4Networkbroadcast_addressr IPv6Network)rr"s rrbroadcast_addrr* s <t|t {fn$$  ! !<00$,00 "      {fo%%  ! !<00$,00 "     &%rqcfd}|S)zA decorator which can be used to mark a method as deprecated 'replcement' is the method name which will be called instead. c|jdd|j|_tj|fd}|S)Nz*() is deprecated and will be removed; use z () insteadchtjtdt||i|S)Nrk)category stacklevel)warningswarnDeprecationWarningr)rrrr replacements rrinnerz/deprecated_method..outer..inner-s: M#(:q I I I I-74--t>v>> >rq)rmrrr)rr4rr3s @rrouterz deprecated_method..outer%su| ( ( ( ( (  ; CK    ? ? ? ? ?   ? rqrp)r3r5s` rrr3r3 s#      Lrqc8eZdZdZdZdZdZdZd dZdZ dS) _WrapNumberszNWatches numbers so that they don't overflow and wrap (reset to zero). c`tj|_i|_i|_i|_dSr) threadingLocklockr reminders reminder_keysrs rrrz_WrapNumbers.__init__<s-N$$  rqc||jvsJ||jvsJ||jvsJ||j|<tjt |j|<tjt |j|<dSr)rr<r=r defaultdictintset)r input_dictrs rr _add_dictz_WrapNumbers._add_dictBs}4:%%%%4>))))4-----% 4*6s;;t#.#:3#?#?4   rqc|j|}t|t|z }|D]4}|j||D]}|j||=|j||=5dS)zIn case the number of keys changed between calls (e.g. a disk disappears) this removes the entry from self.reminders. N)rrAkeysr=r<)rrBrold_dict gone_keysgone_keyremkeys rr_remove_dead_remindersz#_WrapNumbers._remove_dead_remindersJs:d# ((3z/@/@+A+AA ! 3 3H,T28< 1 1N4(00"4(22 3 3rqcl||jvr||||S||||j|}i}|D]}||} ||}n#t$r|||<Y%wxYwg}t t |D]} || } || } || f} | | krA|j|| xx| z cc<|j||| | | |j|| zt|||<||j|<|S)zlCache dict and sum numbers which overflow and wrap. Return an updated copy of `input_dict`. ) rrCrJrrangelenr<r=addappendtuple) rrBrrFnew_dictr input_tuple old_tuplebitsi input_value old_valuerIs rrrunz_WrapNumbers.runUs tz ! ! NN:t , , ,  ##J555:d# ( (C$S/K $SM    !,    D3{++,, H H)!n %aL q**N4(000I=000&t,S155f=== K$.*>v*FFGGGG!$KKHSMM% 4sAA/.A/Nc|j5|L|j|j|jnQ|j|d|j|d|j|dddddS#1swxYwYdS)z>Clear the internal cache, optionally only for function 'name'.N)r;rrr<r=pop)rrs rrrz_WrapNumbers.cache_clear|s Y 3 3|   """$$&&&"((**** tT***""4..."&&tT222 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3sB B55B9<B9cl|j5|j|j|jfcdddS#1swxYwYdS)z5Return internal cache dicts as a tuple of 3 elements.N)r;rr<r=rs rr cache_infoz_WrapNumbers.cache_infos Y D DJ0BC D D D D D D D D D D D D D D D D D Ds )--r) rmrnrorrrCrJrXrr\rprqrrr7r77s   @@@ 3 3 3%%%N 3 3 3 3DDDDDrqr7ctj5t||cdddS#1swxYwYdS)zGiven 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;rX)rBrs rrr<r<s ))wwz4(())))))))))))))))))s 599ic0t|dtS)Nrb) buffering)openFILE_READ_BUFFER_SIZE)fnames rrr>r>s t'< = = ==rqct|ttt} t|_n.#t $rYn"t $r|wxYw|S)zaOpen a file in text mode by using the proper FS encoding and en/decoding error handlers. )raencodingerrors)rbrcr0r1 _CHUNK_SIZErrclose)rdfobjs rrr=r=s  '    D 1         Ks 1 AAc|tur9||5}|cdddS#1swxYwYdS ||5}|cdddS#1swxYwYdS#t$r|cYSwxYw)zRead entire file content and return it as a string. File is opened in text mode. If specified, `fallback` is the value returned in case of error, either if the file does not exist or it can't be read(). N)_DEFAULTreadr)rdfallback_openfs rrr?r?s, 8 U5\\ Q6688                   u vvxx                     OOO sB6:: A=A0# A=0A44A=7A48A== B  B c0t||tS)z,Same as above but opens file in binary mode.)rnro)r?r>)rdrns rrr@r@s ux{ ; ; ;;rq%(value).1f%(symbol)scPd}i}t|ddD]\}}d|dzdzz||<t|ddD]F}t|||kr+t|||z }|t zcSG|t |d|zS)zUsed by various scripts. See: https://code.activestate.com/recipes/578019-bytes-to-human-human-to-bytes-converter/?in=user-4178764. >>> bytes2human(10000) '9.8K' >>> bytes2human(100001221) '95.4M' ) BKMGTPEZYrlN r)symbolr) enumeratereversedabsrlocalsdict)nrsymbolsprefixrUsr~rs rrrArAs> . .A . . ..s :AA<ctst||dStr"tt||||dSddl}d}|jjj}|jjj}tdddd}||d< ||}nE#t$r8d |d t| } t| dwxYw|r |dkr|d z }|tjurd nd } |j|_|| } || | t|||| |dS#|| |wxYw)z$Print a colorized version of string.rrNrk)rrrrrz; choose between ii)rEprintrrDctypeswindllKernel32 GetStdHandleSetConsoleTextAttributerrrrEr rstderrc_ulongrestype) rrrrr DEFAULT_COLORrrrr handle_idhandles rrrFrF%s ! !!; ad ; fQt$$4000000  }-: M " : A1Aa888$t  ,5MEE , , ,,,,'',, S//t +  ,  EQJJ QJE3:--CC3 %~ i((... ; !$     # #FM : : : : : # #FM : : : :s BACD<<E c6trddl}||j\}}}}}t |t r t |trd|}nd|}td|d|d|tj dSdS)z@If PSUTIL_DEBUG env var is set, print a debug message to stderr.rNz ignoring zpsutil-debug [:z]> r) rinspect getframeinfo currentframef_back isinstancerrrrr)rrrdlineno__lines_indexs rrrCrCMs +2+?+?  " " ), , (vq&& c9 % % *#w'' *'#'')#)) 5U 5 5V 5 5 5 5CJ        rqr)rr)NF)mrrenumrrrrrr9r0rrrr ImportErrorrboolgetenvrobjectrl__all__rrrplatform startswithr rrr r r r rAIXr&r'r#r(r*r.r"r,r-r$r%r+r)r/rrrrrrrrrrrrIntEnumrjglobalsupdate __members__rtgetfilesystemencodingr0getfilesystemencodeerrorsr1r2rrrrrrr8r5rr4r7r9r6r:r;rBr*r3r7r<r^rr\rcr>r=r?r@rArrstdoutrErDrFrCrprqrrrsy    HHHGGGtIBIn--.. 688   D 7 'T/ (( ))  , ! !"< = = , ! !) , ,   * * ""F  455 le$$ $      !           &'''$,  ())) %3 $ & &--// h (; *C D h + /Y & h * .Y %x ; "; <i+z2 3j; 3 4     k]+j\*  u fy; *CDEFFF>>>>>I>>>BAAAAAEAAA"LLLLLMLLL& A A A A A5 A A AEEEEEUEEE.    ***ZDDDN ( ( (      8DDDD*   ,.TDTDTDTDTDTDTDTDn)))lnn? . ">>>4! ""<<<< 5555&--- === !j ////:CJ%;%;%;%;P     s#AA  A AA A