B Œ=Ý_jfãN@s8dZddlmZmZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl mZddl mZddlmZddlmZddlmZydd lmZWnek rÀdZYnXydd lmZWnek rêdZYnXe jd krddlZndZe jdd kZd ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;dd?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZgNZejd[kZejd\kZe j d]¡Ze j d^¡Z e Z!e j d_¡Z"e j d`¡Z#e j da¡Z$e"pe#pe$Z%e j db¡Z&e j dc¡Z'ddZ(deZ)dfZ*dgZ+dhZ,diZ-djZ.dkZ/dlZ0dmZ1dnZ2doZ3dpZ4dqZ5drZ6dsZ7dtZ8duZ9dvZ:dwZ;dxZd{Z?d|Z@d}ZAedkr°d~ZBdZCdZDn Gd€d„dejEƒZFeGƒ HeFjI¡edkräd‚ZJdƒZKn Gd„d…„d…ejEƒZLeGƒ HeLjI¡e  M¡ZNesd†ZOn2y e  P¡ZOWn$eQk rHer@d‡nd†ZOYnXedHdˆd‰dŠd‹dŒdgƒZRedDdˆd‰dŠd‹gƒZSedBdŽddd‘d’d“gƒZTedCd”d•d–d—d˜d™gƒZUedEdšd›dœddždŸd d¡gƒZVedId¢d£d¤d¥d¦gƒZWed@d§d¨d©dªd«d¬d¦gƒZXedFd¨d­d®d¯d°gƒZYedGd±d²d³d´gƒZZedAdµd¶d·d¸gƒZ[ed¹dºd»d¼gƒZ\ed½d¾dºd¿dÀgƒZ]edÁd‹dÂdÃgƒZ^edÄd¾dºgƒZ_ed8dÅdÆdÇdÈgƒZ`ed=dÉd§gƒZaed>dÊdËdÌgƒZbed?dÍdÎdÏgƒZced:dÍdÎdÏgƒZded;dŽddd‘gƒZeed>> @memoize ... def foo() ... return 1 ... >>> foo() 1 >>> foo.cache_clear() >>> csH|tt| ¡ƒƒf}yˆ|Stk rBˆ||Ž}ˆ|<|SXdS)N)Ú frozensetÚsortedÚitemsÚKeyError)ršÚkwargsÚkeyr)ÚcacheÚfunrdreÚwrappers zmemoize..wrappercs ˆ ¡dS)z Clear cache.N)Úclearrd)r¨rdreÚ cache_clear˜szmemoize..cache_clear)Ú functoolsÚwrapsr¬)r©rªr¬rd)r¨r©rerLs  cs6t ˆ¡‡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() >>> csPy|jˆ}Wn<tk r&ˆ|ƒStk rJˆ|ƒ}|jˆ<YnX|S)N)Ú_cacheÚAttributeErrorr¥)rŒr)r©rdrerª»sz'memoize_when_activated..wrappercSs i|_dS)zjActivate cache. Expects a Process instance. Cache will be stored as a "_cache" instance attribute.N)r¯)ÚprocrdrdreÚcache_activateÉsz.memoize_when_activated..cache_activatecSs"y|`Wntk rYnXdS)zDeactivate and clear cache.N)r¯r°)r±rdrdreÚcache_deactivateÎsz0memoize_when_activated..cache_deactivate)r­r®r²r³)r©rªr²r³rd)r©reÚmemoize_when_activated¡s r´c CsVyt |¡}Wn6tk rD}z|jtjtjfkr4‚dSd}~XYnXt |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 FN)ÚosÚstatÚOSErrorÚerrnoÚEPERMÚEACCESÚS_ISREGÚst_mode)r€ÚstÚerrrdrdrerKÚsc CsNyt |¡Wn6tk rD}z|jtjtjfkr4‚dSd}~XYnXdSdS)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 FNT)rµr¶r·r¸r¹rº)r€r¾rdrdrerNésc Cs`tjrtdkrdSy2t ttj¡}t |¡| d¡WdQRXdStjk rZdSXdS)z2Return True if IPv6 is supported on this platform.NF)z::1rT)ÚsocketZhas_ipv6r rÚ contextlibÚclosingZbindÚerror)ZsockrdrdrerPøs cCszi}d}t}xh| d|¡}||kr$P| d||¡}||krj|||…}||d|…}|rb| ¡}|||<|d}qW|S)zCParse a C environ block of environment variables into a dictionary.rúú=r_)rÚfindÚupper)ÚdatarÚposZWINDOWS_Znext_posZ equal_posr§rƒrdrdrerMs    cCs0tdkr |Sy t |¡Stk r*|SXdS)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)ÚnumrdrdrerQ"s  cCs0tdkr |Sy t |¡Stk r*|SXdS)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ËrdrdrerR/s  cCs|tjtfkr&|rt|Ž}|r&t|Ž}|tjkrJ|ttfkrJ| |t¡}nt}t|ƒ}t|ƒ}|dkrxt ||||||ƒSt |||||||ƒSdS)z2Convert a raw connection tuple to a proper ntuple.N) r¿rr r„rÚgetrrQrRr6r?)rqZfamZtype_rsrtruZ status_maprprdrdrerU<scs‡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‰|jdkrˆ|_t |¡‡‡fdd„ƒ}|S)Nz8%s() is deprecated and will be removed; use %s() insteadcs tjˆtddt|ˆƒ||ŽS)Nr^)ÚcategoryÚ stacklevel)ÚwarningsÚwarnÚDeprecationWarningÚgetattr)rŒršr¦)r‹Ú replacementrdreÚinnerYsz/deprecated_method..outer..inner)rar‘r­r®)r©rÔ)rÓ)r‹reÚouterSs   z deprecated_method..outerrd)rÓrÕrd)rÓrerJOs c@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|_dS)N)Ú threadingZLockÚlockr¨Ú remindersÚ reminder_keys)rŒrdrdrerŠfs z_WrapNumbers.__init__cCsT||jkst‚||jkst‚||jks*t‚||j|<ttƒ|j|<ttƒ|j|<dS)N)r¨ÚAssertionErrorrÙrÚrÚintÚset)rŒÚ input_dictrordrdreÚ _add_dictls  z_WrapNumbers._add_dictcCsd|j|}t| ¡ƒt| ¡ƒ}x<|D]4}x"|j||D]}|j||=qYnXg}xvtt|ƒƒD]f} || } || } || f} | | krÖ|j|| | 7<|j||  | ¡|  | |j|| ¡qˆWt |ƒ||<q>W||j|<|S)zkCache dict and sum numbers which overflow and wrap. Return an updated copy of `input_dict` ) r¨rßrãràr¥ÚrangeÚlenrÙrÚÚaddr˜Útuple) rŒrÞroráZnew_dictr§Z input_tupleZ old_tupleÚbitsÚiZ input_valueÚ old_valuerârdrdreÚruns2      z_WrapNumbers.runNc Csh|jX|dkr0|j ¡|j ¡|j ¡n*|j |d¡|j |d¡|j |d¡WdQRXdS)z>Clear the internal cache, optionally only for function 'name'.N)rØr¨r«rÙrÚÚpop)rŒrordrdrer¬¦s   z_WrapNumbers.cache_clearc Cs"|j|j|j|jfSQRXdS)z5Return internal cache dicts as a tuple of 3 elements.N)rØr¨rÙrÚ)rŒrdrdreÚ cache_info²sz_WrapNumbers.cache_info)N) rarbrcr‘rŠrßrãrër¬rírdrdrdrerÖas ' rÖc Cstjt ||¡SQRXdS)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ÞrordrdrerS¸scKst|df|ŽS)NÚrb)Úopen)Úfnamer¦rdrdreÚ open_binaryÆsròcKs*tr| dt¡| dt¡t|df|Ž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ñr¦rdrdreÚ open_textÊs  r÷ú%(value).1f%(symbol)scCsŽd}i}x0t|dd…ƒD]\}}d|dd>||<qWx>t|dd…ƒD]*}|||krLt|ƒ||}|tƒSqLW|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éÚsrrƒrdrdrerTØs  cCs tjdjS)z+Return updated psutil.PROCFS_PATH constant.r‡)ÚsysÚmodulesZ PROCFS_PATHrdrdrdreÚget_procfs_pathìsrcCs|jttdS)N)rórô)Údecoder4r5)r rdrdreròsrcCs|S)Nrd)r rdrdrerõscCs^tjdkrdSy2ddl}| ¡s$t‚| ¡| d¡dks>t‚Wntk rTdSXdSdS)Nr[TrÚcolorsF)rµroÚcursesÚisattyrÛZ setuptermZtigetnumr‰)ÚfilerrdrdrerXþs  Fc Cstƒs |Sg}tddddddddd d }d |d <y ||}Wn(tk rdtd t| ¡ƒƒ‚YnX| |¡|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ú;)rXrr¥rÊÚlistràr˜r™)r ÚcolorÚboldÚattrrrdrdrerW s    c Cstƒst||dnêtr.tt|||ƒ|dnÐddl}d}|jjj}|jjj}t ddddd}||d<y ||}Wn,t k ržt d |t |  ¡ƒfƒ‚YnX|r´|dkr´|d 7}|tjkrÂd nd } |j|_|| ƒ} || |ƒzt||dWd|| |ƒXdS) z$Print a colorized version of string.)rrNér^r é)rrrrz#invalid color %r; choose between %réiôÿÿÿiõÿÿÿ)rXÚprintrrWÚctypesZwindllZKernel32Ú GetStdHandleÚSetConsoleTextAttributerr¥rÊrràr ÚstderrZc_ulongZrestype) r rrrr"Z DEFAULT_COLORr#r$rZ handle_idZhandlerdrdrerY s0     Z PSUTIL_DEBUGcCs6t t ¡j¡\}}}}}td|||ftjddS)z@If PSUTIL_DEBUG env var is set, print a debug message to stderr.zpsutil-debug [%s:%s]> %s)rN)ÚinspectZ getframeinfoZ currentframeÚf_backr!r r%)r‹rñÚlinenoZ func_nameÚlinesÚindexrdrdrerVFscCsdS)Nrd)r‹rdrdrerVMs)N)N)rø)NF)Žr‘Z __future__rrrÀr¸r­rµr¿r¶r r×rÏÚ collectionsrrrrrr Ú ImportErrorr Ú version_inforÉrõÚ__all__rorrÚplatformÚ startswithrrrr rrrrZAIXr*r+r'r,r.r2r&r0r1r(r)r/r-r3rr!r rrr"rrrrrrr#r$r%ÚIntEnumr`ÚglobalsÚupdateÚ __members__rirjrhÚgetfilesystemencodingr4r5Úgetfilesystemencodeerrorsr°rGrCrArBrDrHr?rErFr@rvryrzr{r7r<r=r>r9r:r;r8r6r„rIr‰r†r“r–r›rœrOrLr´rKrNrPrMrQrRrUrJrÖrSrîr¬ríròr÷rTrrÚstdoutrXrWrYÚboolÚgetenvr&rVrdrdrdreÚs|                                          9   W    "