U |fK@s\dZddlmZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZddlmZddlmZddlZddlm Z ddlm!Z!dd lm"Z"dd lm#Z#dd lm$Z$dd lm%Z%dd lm&Z&ddlm'Z'ddl(m)Z)ddl(m*Z*ddl(m+Z+ddl(m,Z,ddl(m-Z-ddl.m/Z/ddl.m0Z0ddl.m1Z1ddl.m2Z2ddl.m3Z3ddl.m4Z4ddl.m5Z5zddlm6Z6Wn<e7k r@e8e9dddl6Z6W5QRXYnXe/rRddl:Z:ndZ:e%rhddl;md?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhgKZ=diej>kZ?de j@kZAdje j@kp*dke j@kZBeAp4eBZCdle j@kZDe!rneBrneEdmZFdneFGkZHW5QRXndoZHejIdpkZJe KdqkZLe+drdsZMe"reMdtkZNeMdukZOndoZNdoZOdvZPdwZQdxZRdyZSeCrePdz9ZPeSdz9ZSeQd{9ZQeRdz9ZRe jTd|krd}e UZVn d~e UZVdZWe/r,dXddZYndZYeZ[dkZ\e j]^e j]_e j]`eaddZbe j@cde j]_ebdZde j]^e j]`eaZeefejgdZhefedZiefejgdZjefedZkefejgdZlefejgdZme%oe& ZnefedZoefejgdZpefejgdZqefejgdZrefedZszeso&eteuZvWnewk rDdoZvYnXefedZxefedZyefejgdZze"sre o|e {dkZ|ddZ}e}\Z~ZeEe jdZeejddeeDZeedeZeZeZGddGdGejZddZedddDZeddFZddEZeddAZeddZejeSfddBZdddCZddXZddWZGdddZeejdeSddddZZee1efdeSddddd[ZeedeSddddYZddSZddZejddRZddTZdddUZdddVZGdddejZee_GddMdMeZee?dGddLdLeZddPZddQZddZGddNdNZGddOdOZddńZePfddKZdddIZdddJZddd^Zeedfdd_Zejfdd`ZdddaZddbZejddcZdd\ZddӄZdd]ZdddZddeZddfZddhZe%r"ejdddgZnejdddgZejdd܄Ze%rXeejddބdS)zTest utilities.)print_functionN)AF_INET)AF_INET6) SOCK_STREAM)AIX)LINUX)MACOS)NETBSD)OPENBSD)POSIX)SUNOS)WINDOWS) bytes2human)debug)memoize) print_color) supports_ipv6)PY3)FileExistsError)FileNotFoundError)range)super)unicode)which)mockignore)wait_pidAPPVEYORDEVNULLGLOBAL_TIMEOUTTOLERANCE_SYS_MEM NO_RETRIESPYPY PYTHON_EXEPYTHON_EXE_ENVROOT_DIR SCRIPTS_DIR TESTFN_PREFIXUNICODE_SUFFIXINVALID_UNICODE_SUFFIX CI_TESTINGVALID_PROC_STATUSESTOLERANCE_DISK_USAGEIS_64BITHAS_CPU_AFFINITY HAS_CPU_FREQ HAS_ENVIRONHAS_PROC_IO_COUNTERS HAS_IONICEHAS_MEMORY_MAPSHAS_PROC_CPU_NUM HAS_RLIMITHAS_SENSORS_BATTERY HAS_BATTERYHAS_SENSORS_FANSHAS_SENSORS_TEMPERATURESHAS_NET_CONNECTIONS_UNIX MACOS_11PLUS MACOS_12PLUSCOVERAGEAARCH64 QEMU_USERpyrun terminate reap_childrenspawn_testproc spawn_zombiespawn_children_pair ThreadTaskunittestskip_on_access_deniedskip_on_not_implementedretry_on_failureTestMemoryLeakPsutilTestCaseprocess_namespacesystem_namespace print_sysinfois_win_secure_system_procchdir safe_rmpath create_py_exe create_c_exe get_testfn get_winverkernel_version call_until wait_for_pid wait_for_filecheck_net_addressfilter_proc_net_connections get_free_port bind_socketbind_unix_sockettcp_socketpairunix_socketpaircreate_sockets reload_moduleimport_module_by_pathwarncopyload_shared_lib is_namedtupleZ__pypy__GITHUB_ACTIONSZ CIBUILDWHEELZ COVERAGE_RUNz/proc/1/cmdlinez /bin/qemu-Flaarch64cCsntd}ttt|ddd}|dkrjtjtj dddgdd id d }ttt|ddd}|S) Nr.) z-sS-cz-import platform; print(platform.mac_ver()[0])ZSYSTEM_VERSION_COMPAT0T)envuniversal_newlines) platformmac_vertuplemapintsplit subprocess check_outputsys executable) version_strversionr~H/opt/alt/python38/lib64/python3.8/site-packages/psutil/tests/__init__.py macos_versions  r)rl) rrliPijavaz $psutil-%s-z @psutil-%s-u-ƒőősfutf8surrogateescapeufÀ€)asciizus-asciiz..ZPSUTIL_SCRIPTS_DIRscripts cpu_affinitycpu_freqenviron getloadavgionice memory_mapsnet_io_counterscpu_num io_countersrlimitsensors_battery sensors_fanssensors_temperaturesthreadscCsdd}tj}ttdd}trFtjdkrF|dk rFtj|d<||fStrTtj|fSt r|tjp|tj tjp|t dtjddp|t }|std||fStj tj}tj |st|||fSdS) NcSs>ztj|dgtjtjdWntjk r4YdSX|SdS)Nz-V)stdoutstderr)rx check_callPIPECalledProcessError)exer~r~rattempts z_get_py_exe..attempt_base_executable)r__PYVENV_LAUNCHER__z python%s.%srkz"can't find python exe real abspath)osrcopygetattrrzr version_infor{rhrpathrealpathrpsutilProcessr ValueErrorexistsAssertionError)rrpbaserr~r~r _get_py_exes,     rzr+cCs g|]}|drtt|qS)ZSTATUS_ startswithrr.0xr~r~r s rAF_UNIXcsPeZdZdZfddZddZddZdd Zd d Zd d Z ddZ Z S)rFz6A thread task which does nothing expect staying alive.cs$td|_d|_t|_dS)NFMbP?)r__init___running _interval threadingEvent_flagself __class__r~rr-s zThreadTask.__init__cCs|jj}d||jt|fS)Nz<%s running=%s at %#x>)r__name__rid)rnamer~r~r__repr__3szThreadTask.__repr__cCs ||SN)startrr~r~r __enter__7szThreadTask.__enter__cOs |dSr)stop)rargskwargsr~r~r__exit__;szThreadTask.__exit__cCs(|jrtdtj||jdS)zStart thread and keep it running until an explicit stop() request. Polls for shutdown every 'timeout' seconds. zalready startedN)rrrThreadrrwaitrr~r~rr>s zThreadTask.startcCs(d|_|j|jr$t|jqdS)NT)rrsettimesleeprrr~r~rrunGs zThreadTask.runcCs |jstdd|_|dS)z8Stop thread execution and and waits until it is stopped.zalready stoppedFN)rrjoinrr~r~rrMszThreadTask.stop) r __module__ __qualname____doc__rrrrrrr __classcell__r~r~rrrF*s  cstfdd}|S)Ncs.z ||WStk r(tYnXdSr) ExceptionrBrrfunr~rwrapper[s  z&_reap_children_on_err..wrapper functoolswrapsrrr~rr_reap_children_on_errZsrcKs|dt|dt|dt|dttrHd}|d||dkrttd}zLt|d d |d }td |g}t j |f|}t |t |d d dW5t|Xn"t j |f|}t |t|j|S)aCreate a python subprocess which does nothing for some secs and return it as a subprocess.Popen instance. If "cmd" is specified that is used instead of python. By default stdin and stdout are redirected to /dev/null. It also attempts to make sure the process is in a reasonably initialized state. The process is registered for cleanup on reap_children(). stdinrcwdrp creationflagsNdirz import time;zopen(r'%s', 'w').close();z&[time.sleep(0.1) for x in range(100)];rnTdeleteempty) setdefaultrrgetcwdr$r rUrRr#rxPopen_subprocesses_startedaddrZrYpid)cmdkwdsZCREATE_NO_WINDOWtestfnZpylinesprocr~r~rrCfs4         cCsd}ttd}zztdtj|tf}t rDt |dd\}}n t |\}}t |j }tt|ddd}t|t |}||fWSt||dk rt|XdS) aCreate a subprocess which creates another one as in: A (us) -> B (child) -> C (grandchild). Return a (child, grandchild) tuple. The 2 processes are fully initialized and will live for 60 secs and are registered for cleanup on reap_children(). NraV import subprocess, os, sys, time s = "import os, time;" s += "f = open('%s', 'w');" s += "f.write(str(os.getpid()));" s += "f.close();" s += "[time.sleep(0.1) for x in range(100 * 6)];" p = subprocess.Popen([r'%s', '-c', s]) p.wait() r)rTFr)rUrrrRtextwrapdedentrbasenamer#r r@rrrrvrZ _pids_startedr)tfilerssubpchildZgrandchild_pidZ grandchildr~r~rrEs"       c Cstjs tt}td|}d}t|}z| t t |\}}| \}}zTt |gggt t|d}t|t|}t|jd||fWWS|XW5|t||dk rt|XdS)zCreate a zombie process and return a (parent, zombie) process tuple. In order to kill the zombie parent must be terminate()d first, then zombie must be wait()ed on. a import os, sys, time, socket, contextlib child_pid = os.fork() if child_pid > 0: time.sleep(3000) else: # this is the zombie process s = socket.socket(socket.AF_UNIX) with contextlib.closing(s): s.connect('%s') if sys.version_info < (3, ): pid = str(os.getpid()) else: pid = bytes(str(os.getpid()), 'ascii') s.sendall(pid) Nzret == psutil.STATUS_ZOMBIE)rr rrUrrr_closerR settimeoutrr@acceptselectfilenorvrecvrrrrXstatus) Z unix_filesrcrsockparentconn_Zzpidzombier~r~rrDs.       c Ks|dd|ddt}zFt|d}||W5QRXtt|jgf|}t|j||fWSt k rt |YnXdS)zRun python 'src' code string in a separate interpreter. Returns a subprocess.Popen instance and the test file where the source code was written. rNrw) rrUopenwriterCr#rrYrrrR)rrsrcfilefrr~r~rr@s     cKstrdnd}|dtj|dtj|dd|d|t|trTt|}tj|f|}t |t r|j t d\}}n | \}}|jdkrt||rt||d r|d d }|S) zURun cmd in a subprocess and return its output. raises RuntimeError on error. rrrrrqTrtimeout N)r rrxr isinstancestrshlexrwrrrr communicater returncode RuntimeErrorreendswith)rrflagsprrr~r~rshs&          rc sddddfdd}fddfd d }d d }|}zbt|trb|||WLSt|tjtjfr||W,St|tjr|||WSt d |W5t|tjtjfr||t|tr|n|j}t|rt|XdS)aTerminate a process and wait() for it. Process can be a PID or an instance of psutil.Process(), subprocess.Popen() or psutil.Popen(). If it's a subprocess.Popen() or psutil.Popen() instance also closes its stdin / stdout / stderr fds. PID is wait()ed even if the process is already gone (kills zombies). Does nothing if the process does not exist. Return process exit status. cSsdt|tjrts|n ||tr`t|tjr`zt|j|WStj k r^YnXdSr) rrxrrrr rrr NoSuchProcessprocrr~r~rrs  zterminate..waitcSs6trtrtj}tr(|tjkr(|tj||dSr)rrhsignalSIGKILLr send_signalSIGCONT)r sigr~r~rsendsig+s  zterminate..sendsigc sZz|Wn@tk rN}z"tr0|jdkr0n|jtjkr>W5d}~XYnX||S)N)OSErrorr winerrorerrnoZESRCH)r rerrr&r%rr~rterm_subprocess_proc5s z'terminate..term_subprocess_proccs0z|Wntjk r$YnX||Sr)rrrr,r~rterm_psutil_proc?s z#terminate..term_psutil_proccsFzt|}Wn(tjk r6tr2t||YSYn X||SdSr)rrrr r)rrr )r.r~rterm_pidFs zterminate..term_pidcSs4|jr|j|jr |j|jr0|jdSr)rrrr)r r~r~r flush_popenPs   zterminate..flush_popenz wrong type %rN) rrxrrrvr pid_existsrr TypeError)Z proc_or_pidr% wait_timeoutr-r/r0rrr~)r&r%r.rrrAs&        cCstj|d}tr&t}t|qtr||7}q qDq |sTtd|d}d}|d}t|d}t|dkrt|d}t|dkrt|d}|||fS) z"Return a tuple such as (2, 6, 36).z not POSIXrkrjzcan't parse %rrr) r NotImplementedErrorrunameisdigitrrwrvlen)rr=cminormicronumsmajorr~r~rrWs&         cCsbts tdt}t|dr*|jp&d}n&td|d}|rLt| dnd}|d|d|fS)Nz not WINDOWSservice_pack_majorrz\s\d$rr;) r r<rzgetwindowsversionhasattrrEresearchrvgroup)Zwvsprr~r~rrVs  c@s<eZdZdZeddddfddZddZdd Zd d ZdS) retryzA retry decorator.NrcCs2|r|rtd||_||_||_||_||_dS)Nz/timeout and retries args are mutually exclusive)r exceptionrretriesintervallogfun)rrNrrOrPrQr~r~rrszretry.__init__ccsT|jr*t|j}t|krPdVqn&|jrHt|jD] }dVq:ndVqHdSr)rrrOr)rstop_atr r~r~r__iter__s   zretry.__iter__cCs|jdk rt|jdSr)rPrrrr~r~rrs z retry.sleepcs"tfdd}|_|S)Nc s|d}D]b}z||WSjk rh}z,|}jdk rH|WYqW5d}~XYqXqtrv|ndSr)rNrQrr)rrexcr rrr~rrs  zretry.__call__..wrapper)rr decorator)rrrr~rUr__call__szretry.__call__) rrrrrrrSrrWr~r~r~rrMs  rMr)rNrQrrPcCs$|tkrt|t|dS)zWait for pid to show up in the process list then return. Used in the test suite to give time the sub process to initialize. N)rpidsrrrr~r~rrYs  Tc Cs:t|d}|}W5QRX|s*|s*t|r6t||S)z8Wait for a file to be written on disk with some content.rb)r readrrR)fnamerrrdatar~r~rrZs cCs|}t|st|S)zVKeep calling function for timeout secs and exit if eval() expression is True. )evalr)rexprretr~r~rrXs  cCsndd}zLt|}t|jr0ttj|}nttj|}t rJ|n||Wnt k rhYnXdS)z?Convenience function for removing temporary test files or dirs.c Ss~tt}t|krvz|WStk r4Yn6tk rh}z|}tdt|W5d}~XYnXtdq |dS)Nz ignoring %sg{Gz?)rrrZ WindowsErrorrerr)rrRr r+r~r~r retry_fun*s  " zsafe_rmpath..retry_funN) rstatS_ISDIRst_moderpartialshutilrmtreeremover r)rrastrr~r~rrR's   cCs(zt|Wntk r"YnXdS)z.Convenience function for creating a directory.N)rmkdirrrr~r~r safe_mkdirIsrkc cs.t}zt|dVW5t|XdS)z@Context manager which temporarily changes the current directory.N)rrrQ)dirnamecurdirr~r~rrQQs   cCsRtj|rt|tt|tt |t rNt |}t ||j t jB|S)z6Create a Python executable file in the given location.)rrrratexitregisterrRrfcopyfiler#r rbchmodrdS_IEXEC)rrir~r~rrS\s   c Cstj|rt|tds&td|dkr:td}nt |t sLt|t t |ttddd}||W5QRXztd|jd|gW5t |jX|S) z5Create a compiled C executable in the given location.gcczgcc is not installedNz #include int main() { pause(); return 1; } z.csuffixr z-o)rrrrrrGSkipTestrrrrrnrorRr rUr rrxr)rZc_coderr~r~rrTgs    r:cCs>tjt||d}tj|stj|}tt ||SqdS)zReturn an absolute pathname of a file or dir that did not exist at the time this call is made. Also schedule it for safe deletion at interpreter exit. It's technically racy but probably not really due to the time variant. )prefixrurN) tempfilemktempr'rrrrrnrorR)rurrrr~r~rrUs    c@sBeZdZddZeejds$ejjZe s>ddZ e j ddZ dS) TestCasecCs.|jj}|dsd|}d||jj|jfS)Nzpsutil.z psutil.tests.z%s.%s.%s)rrrrZ_testMethodName)rZfqmodr~r~r__str__s zTestCase.__str__assertRaisesRegexcCsdSrr~rr~r~rrunTestszTestCase.runTestcos dVdSrr~)rrkwr~r~rsubTestszTestCase.subTestN)rrrr{rGrGrzZassertRaisesRegexpr|rr} contextlibcontextmanagerrr~r~r~rrzs rzc@sZeZdZdZdddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ dS)rLzUTest class providing auto-cleanup wrappers on top of process test utilities. r:NcCst||d}|t||S)N)rur)rU addCleanuprR)rrurr\r~r~rrUs  zPsutilTestCase.get_testfncOst||}|t||Sr)rCrrA)rrrrr~r~rrCs  zPsutilTestCase.spawn_testproccCs*t\}}|t||t|||fSr)rErrA)rZchild1Zchild2r~r~rrEs   z"PsutilTestCase.spawn_children_paircCs*t\}}|t||t|||fSr)rDrrA)rrr r~r~rrDs   zPsutilTestCase.spawn_zombiecOs*t||\}}|t||t||Sr)r@rrRrA)rrrrrr~r~rr@s  zPsutilTestCase.pyruncCs||tj||j|j||j|j|jrB||jdt|tj rv||j |j |j dk rv| |j dt |t|dS)Nr:r)ZassertIsInstancerError assertEqualrr_nameZassertNotEqualr ZombieProcessppidZ_ppidZassertGreaterEqualrrepr)rr rTr~r~r_check_proc_excs  zPsutilTestCase._check_proc_excc Cs|tj4}zt|Wntjk r:tdYnXW5QRX||jj|||jj dt |rxt|| |t | |ddt DdS)Nz&wasn't supposed to raise ZombieProcesscSsg|] }|jqSr~rYrr~r~rrsz0PsutilTestCase.assertPidGone..) assertRaisesrrrrrrrNrrr1Z assertNotInrX process_iter)rrcmr~r~r assertPidGoneszPsutilTestCase.assertPidGonec Cs||jt|}|j|jddD]\}}|j||dlz |}WnFtjk r^YnDtjk r}z| ||W5d}~XYnXd||f}t |W5QRXq$|j dddS)NT clear_cacher rz-Process.%s() didn't raise NSP and returned %rrr) rrrMiterallrrrrrrr)rr nsrrr`rTmsgr~r~rassertProcessGones   z PsutilTestCase.assertProcessGonec Cs^t|j}|||ts4ts4|t|t|||tj| sRt t |jsbt | | |jt| |jddtDit_| |jddtDt|}|j|jddD]f\}}|j||dJz |Wn8tjtjfk r,}z|||W5d}~XYnXW5QRXqtr|tj}|W5QRX|||j|tj}|W5QRX|||j|tj}|W5QRX|||j||| |!| st t |js t | |jt| |jddtDit_| |jddtDdS) NcSsg|] }|jqSr~rYrr~r~rrsz6PsutilTestCase.assertProcessZombie..cSsg|] }|jqSr~rYrr~r~rrsTrrcSsg|] }|jqSr~rYrr~r~rr3scSsg|] }|jqSr~rYrr~r~rr5s)"rrrrr r hashrZ STATUS_ZOMBIE is_runningrr1as_dictZassertInrXrZ_pmaprMrrrr AccessDeniedrrrcmdlinerNrrsuspendresumerAkill)rr clonerrrrTrr~r~rassertProcessZombiesN    *z"PsutilTestCase.assertProcessZombie)r:N) rrrrrUrCrErDr@rrrrr~r~r~rrLs   zunreliable on PYPYc@seZdZdZdZdZdZer dndZdZ e Z e edZedd Zed d Zd d ZddZddZddZddZddZddZdddZddZdS) rKaTest framework class for detecting function memory leaks, typically functions implemented in C which forgot to free() memory from the heap. It does so by checking whether the process memory usage increased before and after calling the function many times. Note that this is hard (probably impossible) to do reliably, due to how the OS handles memory, the GC and so on (memory can even decrease!). In order to avoid false positives, in case of failure (mem > 0) we retry the test for up to 5 times, increasing call repetitions each time. If the memory keeps increasing then it's a failure. If available (Linux, OSX, Windows), USS memory is used for comparison, since it's supposed to be more precise, see: https://gmpy.dev/blog/2016/real-process-memory-and-environ-in-python If not, RSS memory is used. mallinfo() on Linux and _heapwalk() on Windows may give even more precision, but at the moment are not implemented. PyPy appears to be completely unstable for this framework, probably because of its JIT, so tests on PYPY are skipped. Usage: class TestLeaks(psutil.tests.TestMemoryLeak): def test_fun(self): self.execute(some_function) rlrrTZ PSUTIL_DEBUGcCstddS)NF)r _set_debugclsr~r~r setUpClassoszTestMemoryLeak.setUpClasscCst|jdSr)rr_psutil_debug_origrr~r~r tearDownClasssszTestMemoryLeak.tearDownClasscCs|j}t|d|jS)NZuss) _thisprocmemory_full_inforZrss)rmemr~r~r_get_memws zTestMemoryLeak._get_memcCstr|jS|jSdSr)r rnum_fds num_handlesrr~r~r _get_num_fds}s zTestMemoryLeak._get_num_fdscCs|jrt|dtjddS)Nyellow)colorfile)verboserrzr)rrr~r~r_logszTestMemoryLeak._logcCsx|}|||}||}|dkr8|d||dkrttrHdnd}|dkr\|d7}d|||f}||dS) zMakes sure num_fds() (POSIX) or num_handles() (Windows) does not increase after calling a function. Used to discover forgotten close(2) and CloseHandle syscalls. rzHnegative diff %r (gc probably collected a resource from a previous test)fdhandler;rz%s unclosed %s after calling %rN)rcallfailr )rrbeforeafterdifftype_rr~r~r _check_fdss   zTestMemoryLeak._check_fdscCs^tjdd|}t|D]}||}~~qtjdd|}|tjg||}|S)zGet 2 distinct memory samples, before and after having called fun repeatedly, and return the memory difference. r;)Z generation)gcZcollectrrrrgarbage)rrtimesZmem1rr`Zmem2rr~r~r _call_ntimess    zTestMemoryLeak._call_ntimesc Csg}d}|}td|dD]}|||} d|t| t| ||f} || | |kp^| |k} | r||dkrv|| dS|dkrt|| ||7}| }q|d|dS)Nrr;z,Run #%s: extra-mem=%s, per-call=%s, calls=%sz. )rrrappendrprintrr) rrrrO tolerancemessagesZprev_memZincreaseidxrrsuccessr~r~r _check_mems.     zTestMemoryLeak._check_memcCs|Srr~)rrr~r~rrszTestMemoryLeak.callNc Cs|dk r |n|j}|dk r|n|j}|dk r0|n|j}|dk rB|n|j}zD|dksZtd|dksjtd|dksztd|dkstdWn.tk r}ztt|W5d}~XYnX||||||j ||||ddS) zTest a callable.Nr;ztimes must be >= 1rzwarmup_times must be >= 0zretries must be >= 0ztolerance must be >= 0)rrOr) r warmup_timesrOrrrrrrr)rrrrrOrr+r~r~rexecutes  zTestMemoryLeak.executec s"fdd}j|f|dS)znConvenience method to test a callable while making sure it raises an exception on every call. csdSr)rr~rTrrr~rrsz*TestMemoryLeak.execute_w_exc..callN)r)rrTrrrr~rr execute_w_excszTestMemoryLeak.execute_w_exc)NNNN)rrrrrrrr*rOrrrrboolrgetenvr classmethodrrrrrrrrrrrr~r~r~rrKFs2    cCsddl}ddl}ddl}ddl}ddl}z ddl}Wntk rLd}YnXz ddl}Wntk rrd}YnX|}t j rt drt d|d<nzt j rdtd|d<n^t jrddttt|d<ttdr|dd t7<nd ttf|d<d tttg|d <t jrJtd |d <d ttt g|d<t!|dd|d<|dk r|dd|j"7<t jrt drt ddg}t|#dd|d<nd|d<t$d} | r| |d<t%&|d<|'} d| d| df|d<|j(t )*d|d<|j+*d|d<|,|d<t-j./d|d <t-0|d!<t1|d"<t2|d#<t-3|d$<t 4|d%<d&t5d'd(t 6D|d)<t 7} d*t8| j9t:| j;t:| j<f|d+<t =} d*t8| j9t:| j;t:| j<f|d,<t>t ?|d-<t @A} | Bd.d|C| |d/<tDd0t%jEd1|FD]$\}}tDd2|d3|ft%jEd1qbtDd0t%jEd1t%jGHtrt-d4nt d5rt-d6tDd0t%jEd1t%jGHdS)7Nr lsb_releasezlsb_release -d -sZOSz Darwin %szWindows  win32_editionz, z%s %sarchrkZkernelpython __version__z not installedpipz (wheel=%s)rsz --versionrr;glibcz fs-encodingz%s, %slangz%Y-%m-%d %H:%M:%Sz boot-timeruser~homerZpyexehostnameZPIDZcpusz%.1f%%, %.1f%%, %.1f%%cSsg|]}|tdqS)d)r cpu_countrr~r~rr5sz!print_sysinfo..Zloadavgz%s%%, used=%s, total=%sZmemoryswaprXrr zF======================================================================rz%-17s %s:ZtasklistZpszps aux)I collectionsdatetimegetpasslocalepprintr ImportErrorwheel OrderedDictrrrrZOSXrrrsr rrur win32_verrGrsystemr}list architecturemachiner r=python_implementationpython_versionpython_compilerrrrwlibc_verrzgetfilesystemencoding getlocale fromtimestamp boot_timestrftimenowgetuserrr expanduserrr#nodegetpidrrtrvirtual_memoryrvpercentrusedtotal swap_memoryr?rXrrr7pformatrritemsrflush)rrrrrrrinfooutrrrrZpinfokvr~r~rrOs                        cCs8tdd}z||dkWStk r2YdSXdS)NcSsXi}td}|ddD]6}dd|dD}|dt|d}}|||<q|S)Nztasklist.exe /NH /FO csvr;cSsg|]}|ddqS)"r:)replacerr~r~rr]sz@is_win_secure_system_proc..get_procs..,r)r splitlinesrwrv)r`rlinebitsrrr~r~r get_procsXs z,is_win_secure_system_proc..get_procsz Secure SystemF)rKeyError)rr r~r~rrPVs  cCs6t}t|dr|St|dr2t|SdS)Nrrr)rrrGrrandomchoicer)rr~r~r_get_eligible_cpuhs   rc@sJeZdZdZddifddifgZddifddddifd difd difd difd difd difddifddifddifg Zddifddifddifddifddifddifddifddifddddifddifddifddifd difd!difd"difd#difd$difgZerNed%difg7Zed&difg7Zed'difg7Zed(difg7Zerded)difg7Ze rzed*difg7Ze red+e j fifg7Ze red,difg7Zered-difg7Zered.difg7Zered/difg7Zered0dd1d2ifg7ZgZer"eddifg7Znede jfifg7Ze rRed+e j d3fifg7Ze rerved*e jd4fifg7Zned*e jfifg7Ze red,egfifg7Zd5ejfifd6difd7difd8difd9difgZered5ejfifg7Zed5ejfifg7ZeeeeZd:d;ZdEdd?Z e!d@dAZ"e!dBdCZ#dDS)FrMaA container that lists all Process class method names + some reasonable parameters to be called with. Utility methods (parent(), children(), ...) are excluded. >>> ns = process_namespace(psutil.Process()) >>> for fun, name in ns.iter(ns.getters): ... fun() cpu_percentr~Zmemory_percentrr6r5T connectionsrZmemory_info_exZoneshotrparentsrrrr cpu_timesZ create_timerrrZ memory_infornet_connectionskindrniceZnum_ctx_switchesZ num_threadsZ open_filesrrrusernameZuidsZgidsZterminalrrrrrrrrrgroupedF)rirr#rrrArcCs ||_dSr)_proc)rr r~r~rrszprocess_namespace.__init__ccsZt|}t||D]>\}}}|r,|t|j|}tj|f||}||fVqdSz_Given a list of tuples yields a set of (fun, fun_name) tuples in random order. N)rrshufflerrrrre)rlsrfun_namerrrr~r~rrs  zprocess_namespace.itercCs|jj|jjdddS)z&Clear the cache of a Process instance.T)Z _ignore_nspN)r_initrrr~r~rrszprocess_namespace.clear_cachecCs>|D]4\}}}d|}t||sd|jj|f}t|qdS)z}Given a TestCase instance and a list of tuples checks that the class defines the required test method names. Ztest_z$%r class should define a '%s' methodN)rGrrAttributeError)rZ test_classrr r  meth_namerr~r~rtest_class_coverages z%process_namespace.test_class_coveragecCs`tdd|jD}tdd|jD}tddttjD}||B|A}|r\td|dS)NcSsg|] }|dqSrr~rr~r~rrsz*process_namespace.test..cSsg|] }|dqSrr~rr~r~rrscSsg|]}|ddkr|qS)rr r~rr~r~rrs z!uncovered Process class names: %r)rrignoredrrrr)rthisr%klassZleftoutr~r~rtests  zprocess_namespace.testN)T)$rrrrutilsr%gettersr r1r2r5rZ RLIMIT_NOFILEr.r4r0r r3ZsettersZNORMAL_PRIORITY_CLASSrZIOPRIO_CLASS_NONEZ IOPRIO_NORMALrr!SIGTERMZkillersZ CTRL_C_EVENTZCTRL_BREAK_EVENTrrrrrr$r(r~r~r~rrMqs      c@seZdZdZddifddddifddddifddifd dd difd dd difd dd difd dddifdefifddddifddifddifddddifdefifddifddifddifddifgZere re dkrneddd difg7Ze r eddifg7Ze r"eddifg7Zer8eddifg7ZerNed difg7Zerted!difg7Zed"d#ifg7Zd$difd%egfifd&difd'difgZeZed(d)ZejZd*S)+rNzA container that lists all the module-level, system-related APIs. Utilities such as cpu_percent() are excluded. Usage: >>> ns = system_namespace >>> for fun, name in ns.iter(ns.getters): ... fun() rr~rZlogicalFTZ cpu_statsrZpercpuZdisk_io_countersZperdiskZdisk_partitionsr disk_usagerrZ net_if_addrsZ net_if_statsrZpernicr1rXrZusersrarm64rrrrrZwin_service_iterZwin_service_get)algrr8rZcpu_times_percentccsLt|}t||D]0\}}}tt|}tj|f||}||fVqdSr)rrrrrrre)rr rrrr~r~rr2s   zsystem_namespace.iterN)rrrrrrrr*r/rrrrHAS_GETLOADAVGr9r8r6r rrr%r staticmethodrrMr$r~r~r~rrNsX          cCst|st|d|_|S)zA decorator to mark a TestCase class. When running parallel tests, class' unit tests will be run serially (1 process). T)inspectisclassrZ _serialrun)r'r~r~r serialrunAsr3cCsdd}ttd||dS)zZDecorator which runs a test function and retries N times before actually failing. cSstd|tjddS)Nz %r, retryingr)rrzr)rTr~r~rrQPsz retry_on_failure..logfunN)rNrrOrQ)rMr)rOrQr~r~rrJKscsfdd}|S)z,Decorator to Ignore AccessDenied exceptions.cstfdd}|S)Ncs@z ||WStjk r:dk r,s,tdYnXdS)Nzraises AccessDenied)rrrGrvrronly_ifr~rr\s z9skip_on_access_denied..decorator..wrapperrrr5rrrV[s z(skip_on_access_denied..decoratorr~r5rVr~r6rrHXs csfdd}|S)z3Decorator to Ignore NotImplementedError exceptions.cstfdd}|S)NcsHz ||WStk rBdk r*s*dj}t|YnXdS)Nz4%r was skipped because it raised NotImplementedError)r<rrGrv)rrrr4r~rros z;skip_on_not_implemented..decorator..wrapperrrr6rrrVns z*skip_on_not_implemented..decoratorr~r7r~r6rrIks  127.0.0.1c Cs@tt(}||df|dW5QRSQRXdS)z6Return an unused TCP port. Subject to race conditions.rr;N)rclosingsocketbind getsockname)hostrr~r~rr]scCs|dkr|ttfkrd}t||}z@tjdkrB|tjtjd|||tj kr`| d|WSt k r| YnXdS)zBinds a generic socket.Nr:r)ntcygwinr;r) rrr:rr setsockopt SOL_SOCKET SO_REUSEADDRr;rlistenrr)familytypeaddrrr~r~rr^s     cCsrtjs ttj|rt|ttj|}z"|||tj krL| dWnt k rl| YnX|S)zBind a UNIX socket.r) rr rrrrr:rr;rrDrr)rrFrr~r~rr_s   r>c Cstt|t}|||d|}t|t}zJ|||}|\}}||krz||fWW5QRS| qPWnt k r| YnXW5QRXdS)z^Build a pair of TCP sockets connected to each other. Return a (server, client) tuple. rN) rr9r:rr;rDr<connectrrr()rErGllr@Zcaddrar~r~rr`s     cCstjs td}}z@t|tjd}|dttjtj}|d||Wn6t k r|dk rr| |dk r| YnX||fS)zBuild a pair of UNIX sockets connected to each other through the same UNIX file name. Return a (server, client) tuple. NrFr) rr rr_r:r setblockingrrHrr)rserverclientr~r~rras   c csg}d}}z|ttjtj|ttjtjtrd|ttj tj|ttj tjt rt rt }t }t |\}}t|tjd}|||fD]}||q|VW5|D] }|q||fD]}|dk rt|qXdS)z1Open as many socket families / types as possible.NrK)rrRrr^r:rr SOCK_DGRAMrrr r:rUrar_)socksZfname1Zfname2rr\s1s2Zs3r~r~rrbs*     cCsddl}tr(tr(ts(t|tjs(t||tjkrdd| dD}t |dksZt||D]"}d|krvdks^nt|q^tst |}| |nd|tj krt|tst|tst |}||n0|tjkrtd|dk st|n td |dS) z[Check a net address validity. Supported families are IPv4, IPv6 and MAC addresses. rNcSsg|] }t|qSr~)rvrr~r~rrsz%check_net_address..rjrz([a-fA-F0-9]{2}[:|\-]?){6}zunknown family %r) ipaddressenumrr"rIntEnumrr:rrwr?r IPv4Addressrr IPv6AddressrZAF_LINKrHmatchr)rGrErTZoctsnumr~r~rr[s&       cCsTdd}dd}dd}dd}d d }||||||||||d S) z*Check validity of a connection namedtuple.cSst|dk}t|dks$tt||d|jks.check_ntuplec Ss|jtttfkst|jtdk r:t|jtjsNt|nt|jtsNt||jtkrt |j|j }t |Rz| |jddfWn2t jk r}z|jtjkrW5d}~XYnXW5QRXn |jtkr|jtjkst|jdS)Nr)rErrrrrUrrVrvr:rFrr9r;r[errorr*Z EADDRNOTAVAILrr CONN_NONE)rrr+r~r~r check_family"s     z-check_connection_ntuple..check_familycSsttdt}|jtjtj|fks,t|jtdk rLt|jtj s`t|nt|jt s`t||jtjkr|j t j kst|j dS)NSOCK_SEQPACKET)rr:objectrFrrOrrUrrVrvrrr_)rrar~r~r check_type7s z+check_connection_ntuple..check_typecSs|j|jfD]}|jttfkrt|ts4tt||s:q t|j t sTtt|j d|j krjdksvnt|j t |j |jq |jt kr t|ts tt|q dS)Nri)r[r\rErrrrtrrFportrvr[iprr)rrGr~r~r check_addrsFs" z,check_connection_ntuple..check_addrscSst|jtst|jddttD}|j|ks.check_status..) rrrrrrrErrrFrr_)rZvalidsr~r~r check_statusSsz-check_connection_ntuple..check_statusNr~)rr]r`rcrfrgr~r~rcheck_connection_ntuples   rhcCsLg}|D]>}tr<|jtjkrsz is_namedtuple..)rF __bases__r?rtrrr)rtbrr~r~rrgs  c#sttrdnddt|d}fddtD}t|}t||zt ||VW5t |XdS)zCtx manager which picks up a random shared CO lib used by this process, copies it in another location and loads it in memory via ctypes. Return the new absolutized path. pypyrz.sortcs6g|].}tj|jdkr|jkr|jqS)r;)rrrnlowerrrextr~rrs'copyload_shared_lib..N) r"rUrrrrrrfrprRctypesCDLL)rudstlibsrr~rrrfs       c #sddlm}ddlm}dt|d}fddtD}trb|sbddtD}t |}t ||d }zt|}|VW5|d k rtj j j}|jg|_||j}|dkr|t|Xd S) zCtx manager which picks up a random shared DLL lib used by this process, copies it in another location and loads it in memory via ctypes. Return the new absolutized, normcased path. r)WinError)wintypesz.dllrtcsFg|]>}|jrdtj|jkrd|jkr|jqS)rZwow64)rrrrrrrr~rrs rcSs(g|] }dtj|jkr|jqS)r)rrrrrr~r~rrsN)rrrrUrrrr"rrrfrpwindllkernel32 FreeLibraryZHMODULEZargtypesZ_handlerRZWinDLL) rurrrrrcfilerr`r~rrrfs0            cCstdddS)NTr4)rBr~r~r~rcleanup_test_procssrcCs t|Sr)rzexit)r%r r~r~rr)N)F)TF)N)r:N)N)N)r8)r>)r:)r:)r __future__rrnrrr*rrr1rrrrrHrrrfr!r:rbrxrzrxrrrrGrxrrrrrrrr r r r r Zpsutil._commonrrrrrZpsutil._compatrrrrrrrrrcatch_warnings simplefilterrUZpsutil._psposixr__all__builtin_module_namesr"rrrhr*r=r rr[r?maxsizer-rr>rr;r<r!r r,rrrr'r(decoder)rrZASCII_FSrrrrl__file__r%getr&ZHERErGrr.r/r0r/r2r3r:ZHAS_NET_IO_COUNTERSr4r1r5r6rrr7rr8r9Z HAS_THREADSgetuidZ SKIP_SYSCONSrr#r$devnullrrorrr+rrbrrrrrrFrrCrErDr@rr+rArBrWrVrMrrYrrZrXrRrkrrQrSrTrUrzrLZskipIfrKrOrPrrMrNr3rJrHrIr]r^r_r`rarbr[rhr\rcrdrergrfrr~r~r~rsL                            -                              *   0  ) &-  V %;   "     %k  F     R  3