3 ̪e|@sdZddlZddlZddlZddlZddlmZddlmZddlm Z ddl m Z ddl m Z dd l m Zdd l mZdd l mZdd l mZdd l mZddl mZddl mZddl mZddl mZddl mZddl mZddl mZddl mZddl mZddlmZddlmZddlm Z ddlm!Z!gZ"erej#e j$ej%e j&ej'e j(ej)e j*ej+e j,ej-e j.ej/e j0iZ1n~erej#e j$ej'e j(ej)e j*ej2e j,ej+e j,ej%e j3ej4e j&iZ1n:erej#e j$ej'e j(ej)e j*ej+e j,ej%e j3ej4e j&iZ1ej5e j6ej7e j8ej9e j:ej;e jej?e j@ejAe jBejCe jDejEe jFejGe jHejIe jJejKe jLi ZMejNZOejPZPeQedZReQedZSeQedZTeQedZUeVdddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6ZWed7d8d9d:d;dd?d@dAdBg ZXedCdDdEdFdGdHgZYedIdJdKdLdMdNgZZeZZ[edOdDdFdPdQgZ\edRdSZ]edTdUZ^erdedVdWdXdYdZd[d\d]gZ_nedVdWdXdYdZgZ_d^d_Z`d`daZadbdcZbeRrdddZcndedZcdfec_ddgdhZeeserdidjZfndkdjZfdldmZgerdndoZhnerdpdoZhddqdrZie jjZjejkZkejlZlejmZmdsdtZndudvZoer@dwdxZpdydzZqd{d|Zrd}d~ZseddZtddZuesperzddZvne jvZvddZwddZxejyddZzGdddZ{dS)z5FreeBSD, OpenBSD and NetBSD platforms implementation.N) defaultdict) namedtuple) ElementTree)_common)_psposix) _psutil_bsd) _psutil_posix)FREEBSD)NETBSD)OPENBSD) AccessDenied) NoSuchProcess) ZombieProcess) conn_tmap)conn_to_ntuple)debug)memoize)memoize_when_activated) usage_percent)FileNotFoundError)PermissionError)ProcessLookupError)which per_cpu_timesproc_num_threadsproc_open_files proc_num_fds )ppidstatusreal_uid effective_uid saved_uidreal_gid effective_gid saved_gidttynr create_timectx_switches_volctx_switches_unvol read_io_countwrite_io_count user_timesys_time ch_user_time ch_sys_timerssvmsmemtextmemdatamemstackcpunumnamesvmemtotalZ availablepercentusedfreeactiveinactivebufferscachedsharedwired scputimesusernicesystemidleirqpmemrGrHtextdatastack pcputimes children_userchildren_system pmmap_groupedz*path rss, private, ref_count, shadow_count pmmap_extz6addr, perms path rss, private, ref_count, shadow_countsdiskio read_count write_count read_bytes write_bytes read_time write_timeZ busy_timecCstj}tr|\}}}}}}tddR}xJ|D]B}|jdrRt|jdd} q.|jdr.t|jdd} q.WWdQRX||} || } n,|\}}}}}}} } |||} |||} t|| |dd} t|| | | |||| || | S)Nz /proc/meminforbsBuffers:ris MemShared:)round_) cextZ virtual_memr open startswithintsplitrrN)ZmemrOrRrSrTrXrVflinerUrWrQZavailrPrx9/usr/local/lib64/python3.6/site-packages/psutil/_psbsd.pyvirtual_memorys6    "   rzcCs4tj\}}}}}t||dd}tj||||||S)z@System swap memory as (total, used, free, sin, sout) namedtuple.r)rp)rqZswap_memrrsswap)rOrQrRsinsoutrPrxrxry swap_memorysr~cCs"tj\}}}}}t|||||S)z,Return system per-CPU times as a namedtuple.)rq cpu_timesrY)rZr[r\r]r^rxrxryrsrcCsBg}x8tjD],}|\}}}}}t|||||}|j|qW|S)z(Return system CPU times as a namedtuple.)rqrrYappend)retZcpu_trZr[r\r]r^itemrxrxryrs cCs2tdkrtgStjr$d}t|dt_tgS)z(Return system CPU times as a namedtuple.rz&supported only starting from FreeBSD 8T)cpu_count_logicalrr __called__NotImplementedError)msgrxrxryr s FcCstjS)z0Return the number of logical CPUs in the system.)rqrrxrxrxryrsrcCstdkrdSdS)Nr)rrxrxrxrycpu_count_coressrc Csxd}tj}|dk rb|jd}|dkrb|d|d}tj|}zt|jdpRd}Wd|jX|sttdkrtdS|S)z-Return the number of CPU cores in the system.Nz rr%zgroup/children/group/cpu) rqZ cpu_topologyrfindr fromstringlenfindallclearr)rsindexrootrxrxryr$s    c Cstrtj\}}}}}nttrrtj\}}}}}}}tdd.}x&|D]}|jdrDt|jd}qDWWdQRXntrtj\}}}}}}}t j ||||S)z*Return various CPU stats as a named tuple.z /proc/statrosintrrN) r rq cpu_statsr rrrsrtrur r scpustats) ZctxswZintrsZ soft_intrssyscallsZtrapsZfaultsZforksrvrwrxrxryr?s     rcCsg}t}xt|D]}ytj|\}}Wntk r@wYnX|ry t|jddjdd}Wnttfk rd}YnXy t|jddjdd}Wnttfk rd}YnX|j t j |||qW|S)zReturn frequency metrics for CPUs. As of Dec 2018 only CPU 0 appears to be supported by FreeBSD and all other cores match the frequency of CPU 0.  r/rNr) rrangerqcpu_freqrrtru IndexError ValueErrorrrscpufreq)rnum_cpuscpucurrentZavailable_freqZmin_freqZmax_freqrxrxryras$    rcCsttj}tj|ddgS)Ng)floatrqrrr)currrxrxryr{s c CsPg}tj}x>|D]6}|\}}}}d}} tj|||||| } |j| qW|S)zReturn mounted disk partitions as a list of namedtuples. 'all' argument is ignored, see: https://github.com/giampaolo/psutil/issues/906. N)rqdisk_partitionsr sdiskpartr) allretlist partitions partitiondevice mountpointfstypeoptsmaxfilemaxpathntuplerxrxryrs  rc Cstj}i}x|D]}y&tj|}tj|}tj|\}}Wn0tk rn}z|jtjkr^WYdd}~XqXt t drt j |}dj |}d|k} t j | ||||||<qW|S)z)Get NIC stats (isup, duplex, speed, mtu).N NicDuplex,running)net_io_counterskeys cext_posixZ net_if_mtuZ net_if_flagsZnet_if_duplex_speedOSErrorerrnoZENODEVhasattrrrjoin snicstats) namesrrMmtuflagsduplexspeederrZ output_flagsisuprxrxry net_if_statss"        rc Cs|tjkr*td|djddtDft|\}}t}trPtjd||}ntrbtjd|}n tj||}x>|D]6}|\}}}} } } } t |||| | | t | } |j | qtWt |S)z System-wide network connections.z+invalid %r kind argument; choose between %sz, cSsg|] }t|qSrx)repr).0xrxrxry sz#net_connections..rrr) rrrrsetr rqnet_connectionsr r TCP_STATUSESaddlist)kindfamiliestypesrrawlistrfdfamtypeladdrraddrr6pidntrxrxryrs"    rc Csbytj\}}}Wntk r&dSX|dk}|rt|j|j|jnt|j|jYn\tk rpt|j|jYn<t k r|jdkrdt krt|j|jnYnXdS)Nr) rrrr_name_ppidrrr rr)selfargskwargs)funrxrywrapperQs   z wrap_exceptions..wrapper) functoolswraps)rrrx)rrywrap_exceptionsLsrc csty dVWndttfk rNt|jrd?Z%e$d>d@Z&dAdBZ'e(redCdDZ)ne'Z)e*redEdFZ+ne'Z+eredGdHZ,edIdJZ-edKdLZ.edQdMdNZ/d1S)Rrz1Wrapper class around underlying C implementation.rrr_cachecCs||_d|_d|_dS)N)rrr)rrrxrxry__init__}szProcess.__init__cCstj|jdS)z+Raise NSP if the process disappeared on us.N)rq proc_namer)rrxrxry _assert_aliveszProcess._assert_alivecCs$tj|j}t|ttks t|S)z;Retrieves multiple process info in one shot as a raw tuple.)rqrrrrr)rrrxrxryoneshots zProcess.oneshotcCs|jj|dS)N)rcache_activate)rrxrxry oneshot_enterszProcess.oneshot_entercCs|jj|dS)N)rcache_deactivate)rrxrxry oneshot_exitszProcess.oneshot_exitcCs(|jtd}|dk r|Stj|jS)NrM)rrrqrr)rrMrxrxryrMsz Process.namec Csvtr|jdkrdStj|jStrR|jdkr0dSt|tjd|jSQRXn |j}|rnt |dpldSdSdS)Nrz /proc/%s/exe) r rrqZproc_exer rosreadlinkcmdliner)rr rxrxryexes    z Process.execCstr|jdkrgStry tj|jStk r}zb|jtjkrt|jr^t |j|j |j qt |js|t |j|j |j qtd|gSnWYdd}~XqXn tj|jSdS)Nrz'ignoring %r and returning an empty list)r rr rqZ proc_cmdlinerrEINVALrrrrrrr)rrrxrxryr s     zProcess.cmdlinecCs tj|jS)N)rqZ proc_environr)rrxrxryenvironszProcess.environc Cs:|jtd}tj}y||Stk r4dSXdS)Nr=)rrrZget_terminal_mapKeyError)rZtty_nrZtmaprxrxryterminals zProcess.terminalcCs|jtd|_|jS)Nr5)rrr)rrxrxryr5sz Process.ppidcCs.|j}tj|td|td|tdS)Nr7r8r9)rrpuidsr)rrawtuplerxrxryuidss   z Process.uidscCs.|j}tj|td|td|tdS)Nr:r;r<)rrpgidsr)rrrxrxrygidss   z Process.gidscCs8|j}tj|td|td|td|tdS)NrCrDrErF)rrrcr)rrrxrxryrs    zProcess.cpu_timescCs|jtdS)NrL)rr)rrxrxrycpu_numszProcess.cpu_numcCs@|j}t|td|td|td|td|tdS)NrGrHrIrJrK)rr_r)rrrxrxry memory_infos    zProcess.memory_infocCs|jtdS)Nr>)rr)rrxrxryr>szProcess.create_timecCs trtj|jSt|jSdS)N)HAS_PROC_NUM_THREADSrqrrrthreads)rrxrxry num_threadss zProcess.num_threadscCs$|j}tj|td|tdS)Nr?r@)rrpctxswr)rrrxrxrynum_ctx_switchess zProcess.num_ctx_switchescCsLtj|j}g}x*|D]"\}}}tj|||}|j|qWtrH|j|S)N)rqZ proc_threadsrrpthreadrr r)rrrZ thread_idutimeZstimerrxrxryr#s zProcess.threadsinetc Cs|tkr(td|djddtDft|\}}g}trLtj|j|}n&trbtj|j||}ntj|j||}xX|D]P}|dd\}}} } } } t r||ksx| |krqxt ||| | | | t } |j | qxW|j |S)Nz+invalid %r kind argument; choose between %sz, cSsg|] }t|qSrx)r)rrrxrxryr4sz'Process.connections..r")rrrr rqrrr Zproc_connectionsr rrrr)rrrrrrrrrrrrr6rrxrxry connections/s*  zProcess.connectionsNcCstj|j||jS)N)rZwait_pidrr)rtimeoutrxrxrywaitMsz Process.waitcCs tj|jS)N)r getpriorityr)rrxrxrynice_getQszProcess.nice_getcCstj|j|S)N)r setpriorityr)rvaluerxrxrynice_setUszProcess.nice_setcCs|jtd}tj|dS)Nr6?)rrrr)rcoderxrxryr6YszProcess.statuscCs(|j}tj|td|tdddS)NrArBrrr)rrpior)rrrxrxry io_counters_s   zProcess.io_counterscCs:tr|jdkrdStstr&tj|jSttr0dnddS)z)Return process current working directory.rrz&supported only starting from FreeBSD 8N)r rr HAS_PROC_OPEN_FILESrqZproc_cwdrr )rrxrxrycwdis  z Process.cwdZmmapz*path rss, private, ref_count, shadow_countz6addr, perms path rss, private, ref_count, shadow_countcCstdS)N)r)rrxrxry_not_implementedszProcess._not_implementedcCstj|j}dd|DS)z8Return files opened by process as a list of namedtuples.cSsg|]\}}tj||qSrx)r popenfile)rpathrrxrxryrsz&Process.open_files..)rqrr)rrrxrxry open_filess zProcess.open_filescCstj|j}tr|j|S)z=Return the number of file descriptors opened by this process.)rqrrr r)rrrxrxrynum_fdss zProcess.num_fdscCs tj|jS)N)rqZproc_cpu_affinity_getr)rrxrxrycpu_affinity_getszProcess.cpu_affinity_getcCstttt}x$|D]}||krtd||fqWytj|j|Wn\tk r}z@|j t j t j fkrx$|D]}||krttd||fqtWWYdd}~XnXdS)Nz#invalid CPU #%i (choose between %s)) tuplerrrrrqZproc_cpu_affinity_setrrrr ZEDEADLK)rZcpusZallcpusrrrxrxrycpu_affinity_sets  zProcess.cpu_affinity_setcCs tj|jS)N)rqZproc_memory_mapsr)rrxrxry memory_mapsszProcess.memory_mapscCsP|dkrtj|j|St|dkr2tdt||\}}tj|j|||SdS)Nrz4second argument must be a (soft, hard) tuple, got %s)rqZproc_getrlimitrrrrZproc_setrlimit)rresourceZlimitsZsofthardrxrxryrlimits  zProcess.rlimit)r)N)N)0__name__ __module__ __qualname____doc__ __slots__rrrrrrrrMr r r rr5rrrr rrZmemory_full_infor>rrrrr!r#r&r6r*r,rZnt_mmap_groupedZ nt_mmap_extr-r+r0HAS_PROC_NUM_FDSr1r2r4r5r8rxrxrxryrxsf                       r)F)|r< contextlibrrr collectionsrrZ xml.etreerrrrrrqr rr r r r rrrrrrrr_compatrrrrZ__extra__all__ZSIDL STATUS_IDLEZSRUNSTATUS_RUNNINGZSSLEEPSTATUS_SLEEPINGZSSTOPSTATUS_STOPPEDZSZOMBrZSWAITSTATUS_WAITINGZSLOCK STATUS_LOCKEDrZSDEAD STATUS_WAKINGZSONPROCZTCPS_ESTABLISHEDCONN_ESTABLISHEDZ TCPS_SYN_SENT CONN_SYN_SENTZTCPS_SYN_RECEIVED CONN_SYN_RECVZTCPS_FIN_WAIT_1CONN_FIN_WAIT1ZTCPS_FIN_WAIT_2CONN_FIN_WAIT2ZTCPS_TIME_WAITCONN_TIME_WAITZ TCPS_CLOSED CONN_CLOSEZTCPS_CLOSE_WAITCONN_CLOSE_WAITZ TCPS_LAST_ACK CONN_LAST_ACKZ TCPS_LISTEN CONN_LISTENZ TCPS_CLOSING CONN_CLOSINGZPSUTIL_CONN_NONE CONN_NONErZ getpagesizeZPAGESIZEZAF_LINKrZHAS_PER_CPU_TIMESrr+r>dictrrNrYr_Zpfullmemrcrfrgrhrzr~rrrrrrrr disk_usageZdisk_io_countersrZ net_if_addrsrrrrrrrrrrrcontextmanagerrrrxrxrxrys0                                 /