0i1Q  dZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlmZddlmZddlmZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm!Z!ddlm"Z"ddlm#Z#ddlm$Z$ddlm%Z%ddlm&Z&ddlm'Z'ddlm(Z(ddlm)Z)gdZ*dZ+ejXj[d ej\d!Z/ejXj[d ej\d"Z0e1ed#Z2e1ed$Z3ejhd%Z5ejlZ7e jpd&k(Z9e:Z;d'Z<ejzd(d)e>e j~iZ@e@jZAGd*d+ejzZBeCjeBjejejejejejejejejejejejejd, ZQejejejejejejejejejejejd- Z]ed.gd/Z^ed0gd1Z_ed2gd3Z`ed4d5Zaed6eajd7zZced8gd9Zded:d;dZged?gd@ZhdAZidBZjdCZke"dDZl eldEdJZpdKZqdLZrdMZsdNZtdOZudPZvdQZwdRZxejXj[dSsejXj[dTrdUZyndVZyejZzGdWdXemZ{GdYdZZ|e|Z}dmd[Z~d\Zd]ZejZdnd^ZGd_d`ZdndaZdbZdcZddZdeZdfZdgZdhZdiZdjZGdkdlZy#em$r&ZnedFenedGdHdIdIdIaoYdZn[ndZn[nwwxYw)ozLinux platform implementation.N) defaultdict) namedtuple)_common)_psposix) _psutil_linux)ENCODING)NIC_DUPLEX_FULL)NIC_DUPLEX_HALF)NIC_DUPLEX_UNKNOWN) AccessDenied) NoSuchProcess) ZombieProcess)bcat)cat)debug)decode)get_procfs_path) isfile_strict)memoize)memoize_when_activated) open_binary) open_text)parse_environ_block)path_exists_strict) supports_ipv6) usage_percent) PROCFS_PATHIOPRIO_CLASS_NONEIOPRIO_CLASS_RTIOPRIO_CLASS_BEIOPRIO_CLASS_IDLECONN_ESTABLISHED CONN_SYN_SENT CONN_SYN_RECVCONN_FIN_WAIT1CONN_FIN_WAIT2CONN_TIME_WAIT CONN_CLOSECONN_CLOSE_WAIT CONN_LAST_ACK CONN_LISTEN CONN_CLOSINGz/sys/class/power_supply/proc//smaps /smaps_rollupproc_ioprio_getproc_cpu_affinity_get SC_CLK_TCKlittlei AddressFamilyAF_LINKceZdZdZdZdZdZy) IOPriorityrrN)__name__ __module__ __qualname__rr r!r"@/opt/hc_python/lib64/python3.12/site-packages/psutil/_pslinux.pyr8r8dsOOr?r8) RSDTtZXxKWIP) 0102030405060708090A0Bsvmem) total availablepercentusedfreeactiveinactivebufferscachedsharedslabsdiskio) read_count write_count read_bytes write_bytes read_time write_timeread_merged_countwrite_merged_count busy_time popenfile)pathfdpositionmodeflagspmemz"rss vms shared text lib data dirtypfullmem)usspssswap pmmap_grouped) rorsssizerw shared_clean shared_dirty private_clean private_dirty referenced anonymousrx pmmap_extz addr perms  pio)rerfrgrh read_chars write_chars pcputimes)usersystem children_userchildren_systemiowaitct|tsJ|tj|}|j dd}|j drt |s|dd}|S)zWrapper around os.readlink().r (deleted)N) isinstancestrosreadlinksplitendswithr)ros r@rrs` dC &$& ;;t D ::f a D }}\"+=d+CDSz Kr?cJtjdtjdtjdi}||tjtjztjzz}|tjzr|j ddd}|j dd}|S)zZConvert file's open() flags into a readable string. Used by Process.open_files(). rwzw+arzr+)rO_RDONLYO_WRONLYO_RDWRO_APPENDreplace)rs modes_maprrs r@file_flags_to_moderszc2;;RYYEI UbkkBKK7"))CD ED r{{||Ca( <<d #D Kr?c|jdd}d}|rd|}nd|d}tj|tjS)zReturn True if the given name refers to a root device (e.g. "sda", "nvme0n1") as opposed to a logical partition (e.g. "sda1", "nvme0n1p1"). If name is a virtual device (e.g. "loop1", "ram") return True. /!Tz /sys/block/z/device)rraccessF_OK)nameincluding_virtualros r@is_storage_devicersL <<S !DTF#TF'* 99T277 ##r?cFt|d5}|jjdd}dddgd}t}|dk\r|j d|dk\r|j d|d k\r|j d t d |ay#1swYgxYw) zSet a namedtuple of variable fields depending on the CPU times available on this Linux kernel version which may be: (user, nice, system, idle, iowait, irq, softirq, [steal, [guest, [guest_nice]]]) Used by cpu_times() function. /statrN)rniceridlerirqsoftirqsteal guest guest_nice scputimes)rreadlinerlenappendrr) procfs_pathfvaluesfieldsvlens r@set_scputimes_ntuplers  }E* +q##%ab) , KF v;D qy g qy g rz l#;/I , +s "BB /proczignoring exception on import: rzuser system idlecd|d}||jddz} |d}|d}|d} t t d }d}|5|D]C} | j} | jd s%|t| jd z }E ddd|tz}||z } ||z} | t| d z |z} | | z } | |t|d z |z z } t| S#t$r'}t|jdd|cYd}~Sd}~wwxYw#t $r|cYSwxYw#1swYxYw)ayFallback for kernels < 3.14 where /proc/meminfo does not provide "MemAvailable", see: https://blog.famzah.net/2014/09/24/. This code reimplements the algorithm outlined here: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/ commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773 We use this function also when "MemAvailable" returns 0 (possibly a kernel bug, see: https://github.com/giampaolo/psutil/issues/1915). In that case this routine matches "free" CLI tool result ("available" column). XXX: on recent kernels this calculation may differ by ~1.5% compared to "MemAvailable:", as it's calculated slightly differently. It is still way more realistic than doing (free + cached) though. See: * https://gitlab.com/procps-ng/procps/issues/42 * https://github.com/famzah/linux-memavailable-procfs/issues/2 MemFree:Cached:rs Active(file):sInactive(file): SReclaimable:zW is missing from /proc/meminfo; using an approximation for calculating available memoryNz /zoneinfoslowrr9g@) getKeyErrorrargsrrOSErrorstrip startswithintrPAGESIZEmin) memsr]fallbacklru_active_filelru_inactive_fileslab_reclaimableerrr watermark_lowlineavail pagecaches r@calculate_avail_vmemrsj<  Ddhhz1--H /0 !34 01 ?,-Y7 8M D:: >    s@C"D'D&.!D&" D+D D D D#"D#&D/c g}i}ttd5}|D])}|j}t|ddz||d<+ ddd|d}|d} |d} |d }||j d dz } |d } |d} |d} |d} |d} | dk(r t|} | dkrd} |j dn| |kDr|} || z }t|| z |d}|rMdjdj|t|dk(rdnd}tj|td t|| |||| | ||| | S#1swYxYw#t$rd}|j d YwxYw#t$rd}|j d YwxYw#t$r- |d} n"#t$rd} |j dYnwxYwYJwxYw#t$rd} |j dYgwxYw#t$r9 |d|dz|dz} n"#t$rd} |j dYnwxYwYwxYw#t$rd} YwxYw#t$rt|} YwxYw)!a7Report virtual memory stats. This implementation mimics procps-ng-3.3.12, aka "free" CLI tool: https://gitlab.com/procps-ng/procps/blob/ 24fd2605c51fccc375ab0287cec33aa767f06718/proc/sysinfo.c#L778-791 The returned values are supposed to match both "free" and "vmstat -s" CLI tools. /meminforrNs MemTotal:rsBuffers:r`rrrasShmem:s MemShared:rbsActive:r^s Inactive:s Inact_dirty:s Inact_clean:sInact_laundry:r_sSlab:s MemAvailable:rZround_z6{} memory stats couldn't be determined and {} set to 0z, waswerer9 stacklevel)rrrrrrrrrformatjoinrwarningswarnRuntimeWarningrX)missing_fieldsrrrrrYr]r`rarbr^r_rcrr\r[msgs r@virtual_memoryrYsN D )*(3 4DZZ\F!&)nt3DO 5  E  D){# 0j! $((+Q//,i(j! . %H~ /%& A: ).E qyk*   5=DUU]U1=GFMM IIn %(A-E6   c>a8        Q 5 4 )i() (h'( , ,-(F ,F  ! !( + ,, (h'(  . ._%'(()*   .H  ! !* - . .  +$T*+s/EE$E6?FG G5H:I EE32E36FF G#F)(G)GGGGGG21G25 H7?HH7H0-H7/H00H76H7: I I  I$#I$ci}ttd5}|D])}|j}t|ddz||d<+ ddd |d}|d}||z }t||d} ttd }|5dx} } |D]r}|jd r$t|jd dd zdz} n4|jd r#t|jd dd zdz} | o| rn(d} | dz } tj| tddx} } dddtj||||   S#1swYxYw#t$r*t j \}}}}}}}||z}||z}Y0wxYw#1swYfxYw#t$r0} d| d} tj| tddx} } Yd} ~ d} ~ wwxYw)zReturn swap memory metrics.rrrrNs SwapTotal:s SwapFree:rz/vmstatspswpin spswpoutz,'sin' and 'sout' swap memory stats couldn't zbe determined and were set to 0r9rzM'sin' and 'sout' swap memory stats couldn't be determined and were set to 0 ())rrrrrcext linux_sysinforrrrrrrsswap)rrrrrYr]_unit_multiplierr\r[sinsoutrrs r@ swap_memoryrs D )*(3 4DZZ\F!&)nt3DO 5 ]#L! 4D?t'7E88 c>a@d%& ==dGS$ ??c 5 4  373E3E3G01aE4    &Q  003uA 7   c>a8dsN/E  E0FA5F>F*F E/F  F F G%&GGcDt}t|t|d5}|jj }ddddt t jdz}|Dcgc]}t|tz }}t |S#1swYOxYwcc}w)zReturn a named tuple representing the following system-wide CPU times: (user, nice, system, idle, iowait, irq, softirq [steal, [guest, [guest_nice]]]) Last 3 fields may not be available on all Linux kernel versions. rNr) rrrrrrr_fieldsfloat CLOCK_TICKS)rrrrrHs r@ cpu_timesrs"#K%  }E* +q##% , AI--.2 3F.4 5feAh$fF 5 f  , +6sB.BBct}t|g}t|d5}|j|D]{}|j ds|j }|dt tjdz}|Dcgc]}t|tz }}t|}|j|}|cdddScc}w#1swYyxYw)zfReturn a list of namedtuple representing the CPU times for every CPU available on the system. rscpurN) rrrrrrrrrrrr)rcpusrrrrrHentrys r@ per_cpu_timesr&s"#K% D  }E* +q Dv&C (9(9$:Q$>?:@A&Q%([0&A!6* E"  , +B , +s#'C3CCCCCc tjdS#t$rd}tt d5}|D]'}|j j ds#|dz }) dddn #1swYnxYw|dk(rttjd}tt d5}|D]-}|jd d}|j|s)|dz }/ dddn #1swYnxYw|dk(rYy|cYSwxYw) z0Return the number of logical CPUs in the system.SC_NPROCESSORS_ONLNr/cpuinfos processorrNzcpu\drr) rsysconf ValueErrorrrlowerrrecompilerrmatch)numrrsearchs r@cpu_count_logicalr :szz/00  O-.h7 8A::<**<81HC9 8 8 !8ZZ)Fo/0671D::c?1-D||D)q877 !8 -sP!D%A/A/& D/A8 47D++C(C( D(C1 - D;D?Dct}d}d}tj|xstj|D]C}t|5}|j|j j dddEt |}|dk7r|Si}i}ttd5}|D]f}|j j}|s |d||d<i}2|jdsD|jd d \} } t| || <h dddt|j}|xsdS#1swYxYw#t$rYzwxYw#1swYDxYw) z-Return the number of CPU cores in the system.z9/sys/devices/system/cpu/cpu[0-9]*/topology/core_cpus_listz?/sys/devices/system/cpu/cpu[0-9]*/topology/thread_siblings_listNrr cpu cores physical id)rr s :r)setglobraddreadrrrrrrrrsumr) lsp1p2rorresultmapping current_inforkeyvalues r@cpu_count_coresrWsW B EB JB " .2.  ! FF1668>># $ /WF { GL )*(3 4D::<%%'DT7 $  5 4sB .E-&E EE4%EE  EEEEE&cttd5}d}d}d}|D]}|jdrt|j d}n[|jdrt|j d}n-|jdrt|j d}|||ndddd}t j |S#1swY#xYw)z*Return various CPU stats as a named tuple.rNsctxtrsintrssoftirqr)rrrrrr scpustats)r ctx_switches interruptssoft_interruptsrsyscallss r@ cpu_statsr#s )*%0 1Q  Dw'"4::<?3 ) a1 ,"%djjl1o"6(#/* 2"H   j/8 % 2 1sBC/C2C5CC#c ttd5}|Dcgc]?}|jjdrt |j dddAc}cdddScc}w#1swYyxYw)z7Return current CPU frequency from cpuinfo if available.rscpu mhz:rN)rrrrrr)rrs r@_cpu_get_cpuinfo_freqr&ss )*(3 4 zz|&&z2 $**T1%a( )  5 4  5 4sA1AA, A1,A11A:z'/sys/devices/system/cpu/cpufreq/policy0z$/sys/devices/system/cpu/cpu0/cpufreqc t}tjdxstjd}|jdg}tjj }t |D] \}}t|t|k(r ||dz}nt||dd}|`t||d d}|Jd |d }t|dd k(r'|jtjd d d d}t|t|dz }tt||ddz } tt||ddz } |jtj|| | |S)zReturn frequency metrics for all CPUs. Contrarily to other OSes, Linux updates these values in real-time. z,/sys/devices/system/cpu/cpufreq/policy[0-9]*z)/sys/devices/system/cpu/cpu[0-9]*/cpufreqc\ttjd|jS)Nz[0-9]+)rrr grouprHs r@zcpu_freq..sRYYy!%<%B%B%D!Er?)riscaling_cur_freqNrcpuinfo_cur_freqz/sys/devices/system/cpu/cpuz/onlinez0 rz!can't find current frequency filescaling_max_freqscaling_min_freq)r&rsortrror enumeraterrrrrscpufreqNotImplementedErrorr) cpuinfo_freqspathsretpjoinirocurr online_pathrmax_min_s r@cpu_freqr>sr ./  : D YYB C   E F  'GAt5zS//%Q'$.E$(:;dK|E$(:;dK<$?s'"JK;6%? 7#3#3Cc#BC =C-c22t9t#DtE$(:;<=DDtE$(:;<=DD JJw''dD9 :-(. r?cftDcgc]}tj|ddc}Scc}w)z}Alternate implementation using /proc/cpuinfo. min and max frequencies are not available and are set to None. r)r&rr3r*s r@r>r>s18M7NO7N!  C-7NOOOs.c eZdZy)_Ipv6UnsupportedErrorN)r;r<r=r>r?r@rArAsr?rAc^eZdZdZdZdZdZedZed dZ ed dZ d d Z y) NetConnectionsawA wrapper on top of /proc/net/* files, retrieving per-process and system-wide open connections (TCP, UDP, UNIX) similarly to "netstat -an". Note: in case of UNIX sockets we're only able to determine the local endpoint/path, not the one it's connected to. According to [1] it would be possible but not easily. [1] http://serverfault.com/a/417946 c dtjtjf}dtjtjf}dtjtjf}dtjtjf}dtj df}|||||f||f|f|f||f|f|f|f||||f||f||fd |_d|_y)Ntcptcp6udpudp6unix) allrEtcp4rFrGudp4rHrIinetinet4inet6)socketAF_INET SOCK_STREAMAF_INET6 SOCK_DGRAMAF_UNIXtmap _procfs_path)selfrKrFrLrHrIs r@__init__zNetConnections.__init__sv~~v'9'9:););<v~~v'8'89):):;-$dD1$<GG$<GGG4t,D\D\   !r?ctt}tj|jd|dD]Y} t |jd|d|}|j ds3|dddd}||j|t|f[|S#ttf$rYot$rU}|jtjk(rYd}~|jtjk(rt|Yd}~Ƃd}~wwxYw)Nr/fd/fd/zsocket:[r)rlistrlistdirrWrrrrFileNotFoundErrorProcessLookupErrorrerrnoEINVAL ENAMETOOLONGr)rXpidinodesrpinoders r@get_proc_inodeszNetConnections.get_proc_inodessT"** 1 12!C5<=B 9 D$5$5#6auD!EF ##J/!!"IcrNE5M((#s2w8+>, '&'9:  99 ,99 2 22#J s)BD$D,C<(C<;C<<Dci}tD]#} |j|j|%|S#ttt f$rY>wxYwN)pidsupdaterhr`raPermissionError)rXrfres r@get_all_inodeszNetConnections.get_all_inodessT6C  d22378 &'9?K  s 5A  A c $|jd\}}t|d}|sy|jd}|tjk(r`t r0tj |tj|ddd}ntj |tj|}ntj|} t rMtj tjtjdgtjd|}nLtj tjtjdgtjd|}t!j"||S#t$rtstdwxYw) aAccept an "ip:port" address as displayed in /proc/net/* and convert it into a human readable form, like: "0500000A:0016" -> ("10.0.0.5", 22) "0000000000000000FFFF00000100007F:9E49" -> ("::ffff:127.0.0.1", 40521) The IP address portion is a little or big endian four-byte hexadecimal number; that is, the least significant byte is listed first, so we need to reverse the order of the bytes to convert it to an IP address. The port is represented as a two-byte hexadecimal number. Reference: http://linuxdevcenter.com/pub/a/linux/2000/11/16/LinuxAdmin.html :r>asciiNr]z>4Iz<4I)rrencoderPrQ LITTLE_ENDIAN inet_ntopbase64 b16decoderSstructpackunpackrrrAraddr)r{familyipports r@decode_addresszNetConnections.decode_address/s<"::c?D4} YYw  V^^ #%%ff.>.>r.B4R4.HI%%ff.>.>r.BC!!"%B  )) EEFMM%,DEB  )) EEFMM%,DEB||B%%  $/T9  s >BE33FNc #K|jdr tjj|syt |5}|j t |dD]\}} |jdd\ }} } } }}}}}} | |vr || d\}}nd \}}|||k7rB|tjk(r t| } ntj} tj!| |} tj!| |} |||| | | |f dddy#t$rd|d|d|} t| dwxYw#t"$rYwxYw#1swYyxYww) z.Parse /proc/net/tcp* and /proc/net/udp* files.6Nrrerror while parsing ; malformed line rrNr])rrroexistsrrr2rr RuntimeErrorrPrR TCP_STATUSESr CONN_NONErCrrA)filer|type_rf filter_pidrlinenorrladdrraddrstatusrgrrerps r@ process_inetzNetConnections.process_inetbsx == bggnnT&:  t_ JJL )!Q  6 Sb)BAueVQ1aEF?%UmA.GC&GC)jC.? 2 22!-f!5!(!2!2! . = =eV L . = =eV LvueUFCHHC!0_"6.tf5"81TH.'s+5 641! !C_sY=E#E#DA E ,D38 E E!D00E3 D?<E>D??EE Ec #Kt|5}|j|D]}|j} |dd\}}}}}}} | |vr|| } ndg} | D]]\} } ||| k7rt |dk(r|d nd }t jt|}d }t j}| |||||| f_ dddy#t$rd|vrYd|d|} t | wxYw#1swYyxYww) zParse /proc/net/unix files.rrrrrNrr]) rrrrrrrsocktype_to_enumrr)rr|rfrrrtokensrrrgrpairsrerprorrs r@ process_unixzNetConnections.process_unixs$t_ JJL ,281+/Aq!Qq%F?#5ME'LE$GC!-*2C -0[A-=vbz2 ' 8 8U D!#!(!2!2!65$vsKK %%_ ",$ .tf4EdXN's++, _s@ C/&C# B=A1C#4 C/= C  C# C  C##C,(C/c 6t|_||j|}|sgS|j}t }|j |D]\}}}|jd|}|t jt jhvr|j|||||} n|j||||} | D]S\} }}} } } }|rtj| ||| | | }ntj| ||| | | |}|j|Ut|S)Nz/net/)r)rrWrhrnrrVrPrQrSrrrpconnsconnrr^)rXkindrerfr7 proto_namer|rrorrprrr bound_pidconns r@retrievezNetConnections.retrieves0+- ?))#.F ((*Fe)-4 %J''(j\:D&..&//::&&&%C'&&tVV&LFHBFE5%"==FE5%D#==FE5%D GI*9$Cyr?rj) r;r<r=__doc__rYrhrn staticmethodrrrrr>r?r@rCrCs^ !.4 0&0&d(I(IT!L!LFr?rCc,tj|S)z$Return system-wide open connections.)_net_connectionsr)rs r@net_connectionsrs  $ $T **r?cttd5}|j}dddi}ddD]}|jd}|dkDsJt ||d|j }||dzdj j }tt|\}}} } } } } }}}}}}}}}||||| || |f||<|S#1swYxYw)zsReturn network I/O statistics for every network interface installed on the system as a dict of raw tuples. z/net/devNr9rprr) rr readlinesrfindreprrrmapr)rlinesretdictrcolonrr bytes_recv packets_recverrindropin_fifoin_framein _compressedin _multicastin bytes_sent packets_senterroutdropout_fifoout_collisionsout _carrierout_compressedouts r@net_io_countersrs o'(1 2a  3Gab  3qy$$t*$yFU|!!#eaik"((*002* V '                           7J NQ 3 2s C  Cc0tjttjttj t i}tj}i}|D]y} tj|}tj|}tj|\}}dj|}d|v} tj| |||||||<{|S#t$r3} | j t j"k7rt%| Yd} ~ d} ~ wwxYw)z)Get NIC stats (isup, duplex, speed, mtu).,runningN)r DUPLEX_FULLr DUPLEX_HALFr DUPLEX_UNKNOWNr rkeys net_if_mtu net_if_flagsnet_if_duplex_speedrr snicstatsrrbENODEVr) duplex_mapnamesr7rmtursduplexspeed output_flagsisuprs r@ net_if_statsrs / / /J   " " $E C //$'C%%d+E 44T:MFE88E?L%D))j(%lCI J yyELL( #JJ  sAC D")DDc |d}d}tjjtdr|}n?tjjdr|}ntd}t |i}|D]=}|\ }}} } } } } }}}|s t |s| t z} | t z} || | | | | |||f ||<?|S)zcReturn disk I/O statistics for every disk installed on the system as a dict of raw tuples. c 3(Kttd5}|j}dddD]}|j}t |}|dk(r2|d}t |d}t t |dd\ }}} } } } } }}}nl|dk(s|dk\r%|d}t t |dd\ }}}} } } } } }}}n=|dk(r(|d}t t |dd\}}} } d x} x} x}x} }nd |}t|||| || | | || |f y#1swYxYww) N /diskstatsr:r9rrrznot sure how to interpret line )rrrrrrrr)rrrrflenrreads reads_mergedrbytesrtimewrites writes_mergedwbyteswtimerrmrs r@ read_procfsz%disk_io_counters..read_procfs0sV"/+,J7 8AKKME9DZZ\Fv;DrzayF1I69#va|6L4vufmE1itrzay69#va|6L4 feV]E1iay03C0D-vvvKLLLL L}y7x@ o%u ; ;/9 8sDDCDD Dc 3,KtjdD]}tjtjj d|D]\}}}d|vr t tjj |d5}|j jj}dddtjj|}ttdd\ }}} } } } } }}}||| | | | ||| |f y#1swYYxYww)N /sys/blockstatr) rr_walkrorrrrrbasenamerr)blockrootrfilesrrrrrrrrrrrrms r@ read_sysfsz$disk_io_counters..read_sysfs^sZZ -E"$''"'',,|U*K"La&rww||D&9:aVVX^^-335F;ww''-47sF3BK3H1 feV]E1iUFFFElM9FF#M.;:sBD-D0ADD Drrz6/diskstats nor /sys/block are available on this system)rrorrr4rDISK_SECTOR_SIZE)perdiskrrgenrrrrrrrrrrrrrms r@disk_io_countersr+s +;\ F ww~~*+:67m  %l !"  "#&&G). &ufffeUL 906 """"u%}iA )0 Nr?c6eZdZdZddgZdZdZdZdZdZ y ) RootFsDeviceFinderaFdisk_partitions() may return partitions with device == "/dev/root" or "rootfs". This container class uses different strategies to try to obtain the real device path. Resources: https://bootlin.com/blog/find-root-device/ https://www.systutorials.com/how-to-find-the-disk-where-root-is-on-in-bash-on-linux/. majorminorctjdj}tj||_tj||_yNr)rrst_devrr)rXdevs r@rYzRootFsDeviceFinder.__init__s3ggcl!!XXc] XXc] r?cttd5}|jddD]}|j}t |dkr"|dj rt |dnd}|dj rt |dnd}|d}||jk(s}||jk(s|sd|ccdddS dddy#1swYyxYw)Nz /partitionsr9rrrr:/dev/) rrrrrisdigitrrr)rXrrrrrrs r@ask_proc_partitionsz&RootFsDeviceFinder.ask_proc_partitionss /+,K8 9Q ab)v;?*0)*;*;*=F1I4*0)*;*;*=F1I4ayDJJ&5DJJ+>!&tf~-: 9): 9 9s$BC(C8C;C CCcd|jd|jd}t|5}|D]H}|jds|j j dd}|s:d|ccdddS dddy#1swYyxYw)Nz/sys/dev/block/rpz/ueventzDEVNAME=r9r)rrrrr rpartition)rXrorrrs r@ask_sys_dev_blockz$RootFsDeviceFinder.ask_sys_dev_blocksv  Adjj\A t_??:.::<22:>qAD!&tf~- ___sB$B&B6BB c|jd|j}tjd}|D]} t |}|5|j j }||k(rLtjjtjj|}d|cdddcS dddy#1swYxYw#t$rYwxYw)Nrpz/sys/class/block/*/devr) rrriglobrrrrrordirnamer`)rXneedlerrrdatars r@ask_sys_class_blockz&RootFsDeviceFinder.ask_sys_class_blocksJJ>+Dv~!ww//0EF!&tf~ Q%Q  Q%  s C A$CC CCcd}| |j}| |j}| |j }|"t j j|r|Syy#t$r}t|Yd}~dd}~wwxYw#t$r}t|Yd}~rd}~wwxYw#t$r}t|Yd}~d}~wwxYwrj)rrrrrrror)rXrors r@findzRootFsDeviceFinder.finds < //1 < --/ < //1  t 4K!5  c    c    c  sEA!BB#! A?* A::A? B  BB # C, B<<CN) r;r<r=r __slots__rYrrrrr>r?r@rrs,'"I# .. .r?rc(t}t}|st|d5}|D]n}|j}|j ds |j |jD|j dd}|dk(s^|j dp ddd|dk(r?tjjdr tjjd}n"tjj|d }g}tj|}|D]b} | \} } }} | d k(rd } | d vrtjxs| } |s| r||vr:tj | | || } |j#| d|S#1swYxYw) z8Return mounted disk partitions as a list of namedtuples.z /filesystemsnodev rzfsNrz /etc/mtabz /self/mountsnoner> /dev/rootrootfs)rrrrrrrrroisfilerealpathrdisk_partitionsrrr sdiskpartr)rJfstypesrrrfstype mounts_pathretlist partitions partitiondevice mountpointoptsntuples r@rrsheG!#K  +l3 4zz|w/KK -"ZZ-a0F E*5g"''.."=gg&&{3 gg&&+l'CD G%%k2J +4( FD V F , ,')..0:FFV72""6:vtDv  N?5 4sA FFFc tjt}tjd}|j tjdt |Dchc]}|j ddc}}tjd}tjd}|D]*}|jd|}||vs|j|,|D]} |dz}tt|d z } tjjtjj!|d }t#|j%} t|d zd } t|dzd } t#|dzd j%} |  t| d z } |  t| d z } || j| | | | f|stjd}t t+|}|D]} tjj|d}tt|d z } tjj|d}t#|j%} tj|dz}|Dchc]B}djtjj/|j dddD}}d } d } |D]}tjj||dz}t#|d j%}|dk(r/ttjj||dzd } n3|dk(r.ttjj||dzd } |  t| d z } |  t| d z } || jd| | | ft1|Scc}w#t&t(f$rYwxYw#t($rd } YUwxYw#t($rd } YVwxYw#t&t(f$r}t-|Yd }~2d }~wwxYwcc}w#t($rd } YwxYw#t($rd } Y~wxYw)aReturn hardware (CPU and others) temperatures as a dict including hardware name, label, current, max and critical temperatures. Implementation notes: - /sys/class/hwmon looks like the most recent interface to retrieve this info, and this implementation relies on it only (old distros will probably use something else) - lm-sensors on Ubuntu 16.04 relies on /sys/class/hwmon - /sys/class/thermal/thermal_zone* is another one but it's more difficult to parse z/sys/class/hwmon/hwmon*/temp*_*z&/sys/class/hwmon/hwmon*/device/temp*_*rrz5/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*z'/sys/devices/platform/coretemp.*/hwmon/z/sys/class/hwmon/_inputg@@r_maxNr-_crit_labelrz /sys/class/thermal/thermal_zone*temptypez /trip_point*r:_typecritical_temphigh) collectionsrr^rextendsortedrrrsubrrrrrorrrrrrrrrdict)r7 basenamesrH basenames2replraltnamebaserocurrent unit_namer&r$labelr trip_pathsp trip_points trip_point trip_types r@sensors_temperaturesr9 s  ! !$ 'C ;DD )ID6MD1w6D8Ob1779   T{V+    ?V3 IugtX>?AF II@A 3y>* D ww||D&1T +f4ww||D&1IOO- 4.#89J$#A))!,2237!<=# HD) ww||D*w*>?r288:  *# T:+?@4 H&( T:+?@4D#$$T{V3'(#(?V#;'*.  N ! !2wh"? @QT 9A<*$   $     Z( c   *&$#$ &(#'(sO A2OO%!O7.multi_bcatsRDtd+Cd{'s8O "'99;&'s *AABATbatteryNz /energy_nowz /charge_nowz /power_nowz /current_nowz /energy_fullz /charge_fullz/time_to_empty_nowgY@rz /capacityr]r-z AC0/onlinez AC/onliner/statusr dischargingF>fullchargingTi<r)objectrr_POWER_SUPPLY_PATHrrrorrZeroDivisionErrorrrrrPOWER_TIME_UNLIMITEDabsPOWER_TIME_UNKNOWNsbattery)r@rHbatsr energy_now power_now energy_full time_to_emptyr[ power_pluggedonlinersecsleftr?s @r@sensors_batteryrWsO 8D -. .A << )qwwy"8 .    77<<)3t9 5DD=0$2FGJ4,.~0EFITN2D>4IJKt&::;M:#9 j(;6Gc$,r:; b= M   & 5  & 4F! TI%399;AAC ] "!M + + M //  I$9 2:I6=>H  "}r)* a<11H--   GX} ==C .! G B! 211H 2s),HHH HHH32H3cg}tj}|D]8}|\}}}}}tj||xsd|||}|j |:|S)z:Return currently connected users as a list of namedtuples.N)rusersrsuserr) rrawlistitemrttyhostnametstamprents r@rYrYsYGjjlG+/(c8VS ]]4h Dr Nr?ctd}t|5}|D]H}|jdst|j j dccdddSd|}t |#1swYyxYw)zAReturn the system boot time expressed in seconds since the epoch.rsbtimerNzline 'btime' not found in )rrrrrrr)rorrrs r@ boot_timerb sy  &D T aDx(TZZ\//1!455  +4&13  sA7+A7&A77Bctjt}tj|Dcgc]}|j st | c}Scc}w)z7Returns a list of PIDs currently running on the system.)rrsr rr_rr)rorHs r@rkrksD   # #H -DJJt, <,q CF, << .wrapper\sHHdjjT t-d-f- - 3sD)s 2! 4  ! ! #T* 3    ! ! #77>>T%6%6$7qU"CD#C.C7  s+ ' C = C A&& C2A B??C) functoolswraps)rrrss` r@wrap_exceptionsrvWs' __S$ Nr?cLeZdZdZgdZdZdZdZdZe fdZ e e dZ e e d Ze e d Zd Zd Ze d Ze dZe dZe dZe dZej0j3dej4dre dZe dZe dZe d;dZe de e$jJd9fd:Z?y)>ProcesszLinux process implementation.)_cache_ctimero_ppidrWrecZ||_d|_d|_d|_t |_yrj)reror{rzrrW)rXres r@rYzProcess.__init__~s)   +-r?c t|jd|jd}|jd}||dz|dz}|dk(S#t$rYywxYw)Nrrrhr9r:ZF)rrWrerr)rXrrirs r@ _is_zombiezProcess._is_zombiesk "4,,-Qtxxj>?D::d#D$(TAX.FT> !   s%A AAcz|jr+t|j|j|jyrj)rrreror{rXs r@rpzProcess._raise_if_zombies, ?? $**djjA A r?c`tj|jd|jy)z+Raise NSP if the process disappeared on us.rN)rrrWrers r@_raise_if_not_alivezProcess._raise_if_not_alives& 4$$%Qtxxj12r?c t|S#ttf$rVtjj |j d|jr|j|tur|cYSwxYwr) rr`rarrolexistsrWrerpUNSET)rXrors r@ _readlinkzProcess._readlinksh D> !!#56 ww$"3"3!4AdhhZ@A%%'5(#O   s A!A20A2ct|jd|jd}|jd}||j ddz|}||dzdj }i}||d<|d |d <|d|d <|d |d <|d|d<|d|d<|d|d<|d|d<|d|d<|d|d< |d|d<|S#t $rtdd |d<Y|SwxYw)aYParse /proc/{pid}/stat file and return a dict with various process info. Using "man proc" as a reference: where "man proc" refers to position N always subtract 3 (e.g ppid position 4 in 'man proc' == position 1 in here). The return value is cached in case oneshot() ctx manager is in use. rrrh(rr9Nrrrrkrttynr utime stime children_utimerchildren_stime create_time$cpu_num' blkio_ticksz&can't get blkio_ticks, set iowait to 0)rrWrerrr IndexErrorr)rXrrirrr7s r@_parse_stat_filezProcess._parse_stat_files3t(()488*E:;zz$DIIdOa'$/dQhj!'')F q H QiF ayG bzG bzG &r   &r  #BZMI #!'C    # : ;!"C   #s4B>>CCct|jd|jd5}|jcdddS#1swYyxYw)zRead /proc/{pid}/stat file and return its content. The return value is cached in case oneshot() ctx manager is in use. rrCN)rrWrerrXrs r@_read_status_filezProcess._read_status_files<D--.azA Ba668C B Bs AA ct|jd|jd5}|jj cdddS#1swYyxYw)Nrr/)rrWrerrrs r@_read_smaps_filezProcess._read_smaps_filesCD--.az@ AQ668>>#B A As AAc|jj||jj||jj|yrj)rcache_activaterrrs r@ oneshot_enterzProcess.oneshot_enters> ,,T2 --d3 ,,T2r?c|jj||jj||jj|yrj)rcache_deactivaterrrs r@ oneshot_exitzProcess.oneshot_exits> ..t4 //5 ..t4r?c:t|jdS)Nr)rrrs r@rz Process.namesd++-f566r?c\|j|jd|jddS)Nrz/exerr-rrWrers r@exez Process.exe5~~  !488*D 1B  r?ct|jd|jd5}|j}ddds|j gS|j drdnd}|j |r|dd}|j |}|dk(r#t|dk(rd|vr|j d}|S#1swYxYw)Nrz/cmdlinerrr]r)rrWrerrprrr)rXrrsepcmdlines r@rzProcess.cmdlines $++,AdhhZx@ AQ668DB  ! ! #I f-f3 == 9D**S/ &=S\Q.3$;jjoG-B As B99Cct|jd|jd5}|j}dddt |S#1swYt SxYw)Nrz/environ)rrWrerr)rXrrs r@environzProcess.environsR $++,AdhhZx@ AQ668DB"4((B"4((s A  Act|jd}tj} ||S#t$rYywxYw)Nr)rrrget_terminal_mapr)rXtty_nrrVs r@terminalzProcess.terminalsIT**,W56((* <   s7 AAr./ioc |jd|jd}i}t|5}|D]8}|j}|s |j d\}}t |||<: ddd|s|d}t| t|d|d|d|d|d |d S#t $rYwxYw#1swYMxYw#t$r(}|jd d |d |}t |dd}~wwxYw)Nrrs: z file was emptyssyscrssyscws read_bytess write_bytessrcharswcharrz field was not found in z; found fields are ) rWrerrrrrrrrr) rXfnamerrrrrrrs r@ io_counterszProcess.io_counters's4(()488*C8EFU#qD::*8$8$  *%$%$#0 0xx{o%=eWE##)*.!o4/  0sGB5B&B5!C& B2/B51B22B55B> C2 #C--C2c|j}t|dtz }t|dtz }t|dtz }t|dtz }t|dtz }t|||||S)Nrrrrr)rrrr)rXrrrrrrs r@rzProcess.cpu_timesJs&&(fWo&4fWo&4v&678;Fv&678;Fvm,- ;~~vNNr?c:t|jdS)zWhat CPU the process is on.rrrrs r@rzProcess.cpu_numTs4((*9566r?NcXtj|j||jSrj)rwait_pidrero)rXtimeouts r@waitz Process.waitYs  7DJJ??r?c|j(t|jdtz |_|r |jS|jt zS)Nr)rzrrrrb)rX monotonics r@rzProcess.create_time]sR ;; d++-m<= K K ;; {{Y[((r?c t|jd|jd5}d|jj ddD\}}}}}}}dddt S#1swYxYw)Nrz/statmc3@K|]}t|tzywrj)rr).0rHs r@ z&Process.memory_info..|s8+CaA!+Csr)rrWrerrrt) rXrvmsrzrbtextlibrdirtys r@ memory_infozProcess.memory_infonsD--.az@ AQ8+,::<+=+=+?+C8 4CfdCuBCfdCu== B As 1A00A9cdx}x}}t|jd|jd5}|D]}|jdr#|t |j ddzz }7|jdr t |j ddz}h|jdszt |j ddz} ddd|||fS#1swYxYw) Nrrr0sPrivate_rrPss:Swap:)rrWrerrr)rXrvrwrxrrs r@_parse_smaps_rollupzProcess._parse_smaps_rollups ! C #$$%Qtxxj >D{3s4::<?3d::1!$**,q/2T92"4::<?3d:d# #sA?@4GCc#wz:;EDd# #r?ctr |j\}}}n|j \}}}|j }t ||||fzS#ttf$r|j \}}}YCwxYwrj)HAS_PROC_SMAPS_ROLLUPrrar`rrru)rXrvrwrx basic_mems r@memory_full_infozProcess.memory_full_infos$9%)%=%=%?NCd"&!2!2!4S$((*IY#sD)99: : +,=>9%)%6%6%8NCd9sA#A54A5c`d}|j}|s|jgS|jd}g}|jd}|g}|||D]5\}}|jdd} |\} } } } } }|sd}n.get_blockss!D!ZZa0F!!9--d3,002D99%,,T2<.1&)nt.CDO"%((*D11 !+J7<%ay33K@ ($EdX"NC",S/t; I7"N?F"~#++DHHi@@6{a'**05)o-$$TXXy&A 99 ,))+  s!B?B B< .B77B<ct|jd}|j}tj|dS)Nr?)rr PROC_STATUSESr)rXletters r@rzProcess.statuss3&&(2  --r?cg}tj|jd|jd}d}|D]}|jd|jd|} t |}|j ds@t |sL|jd|jd|} t|5}t|jjd}t|jjdd} dddt } t|t|t| | } |j| |r|j+|S#1swY]xYw#ttf$rd}YHwxYw#ttf$rd}Y`t $rW} | j"t"j$k(rYd} ~ | j"t"j&k(rt)| Yd} ~ d} ~ wwxYw) Nrr[Fr\z/fdinfo/rrT)rr_rWrerrrrrrrrrnrr`rarrbrcrdrr) rXrrrrprrorposrsrrrrs r@ open_fileszProcess.open_filess d//0$((3?@ B''($((4tE?G5G5G0(G0/G00G5cftj||j}|j|Srj)rrrer)rXrr7s r@rzProcess.net_connectionss)''dhh7   " r?crttj|jd|jdS)Nrr[)rrr_rWrers r@num_fdszProcess.num_fdss.2::!2!2 31TXXJcBCDDr?c:t|jdS)Nrkrrs r@rkz Process.ppids4((*6233r?sUid:\t(\d+)\t(\d+)\t(\d+)c|j}|j|d\}}}tjt |t |t |Sr)rrrpuidsr)rX_uids_rerreal effectivesaveds r@uidsz Process.uidsK%%'!)!1!1$!7!:i}}SYIE CCr?sGid:\t(\d+)\t(\d+)\t(\d+)c|j}|j|d\}}}tjt |t |t |Sr)rrrpgidsr)rX_gids_rerr(r)r*s r@gidsz Process.gidsr,r?rjFrM)@r;r<r=rrrYrrprrrrvrrrrrrrrrrrrrorgetpidrrrrrrrHAS_PROC_SMAPSrrrrrrrrrrrrHAS_CPU_AFFINITYrrr HAS_PROC_IO_PRIORITYrrhasattrrrrr rr#rkr+r0r>r?r@rxrxrs'I." B3 (- ##J$$3 5 77  2))  ww~~yryy{m3/0  0  0DOO77@@)) >>$ $. # #;<BJJ23RZZ 45  $  $8  ;  ;' E  E N  " #<= < <*4"**5H*I55 40077  8  8!bjj!DE 9    .  3  3  B  Bx#    6.. --^ EE44&BJJ'DEDD &BJJ'DEDDr?rxr2r1)rrvr'enumrbrtrrrrrPrxsysrrrrrrrrr r r r r rrrrrrrrrrrrrrrr__extra__all__rIrorr3r4rr7r6r5rr getpagesizer byteorderrtrHrrIntEnumr AF_PACKETr5r6r8globalsrl __members__STATUS_RUNNINGSTATUS_SLEEPINGSTATUS_DISK_SLEEPSTATUS_STOPPEDSTATUS_TRACING_STOP STATUS_ZOMBIE STATUS_DEADSTATUS_WAKE_KILL STATUS_WAKING STATUS_IDLE STATUS_PARKEDrr#r$r%r&r'r(r)r*r+r,r-rrXrdrnrtrruryrrrrrrrr Exceptionrrrrrrrr rr#r&r> net_if_addrsrArCrrrr disk_usagerrrr9r<rWrYrbrkrerlrvrxr>r?r@rOs %   #"#$$'!""$"+ ('"" $.& V <=  }M'JKt%674!89bjj& 4    )  iV%5%5!67     ''(      " "     $ $           ! !           "  " "              ! !           ,  K L    < > &>? j$,,1G"G HJK -*?*?!@@ B 67 {" # ( $& 0 00K!<~~B4@x  (:'T2 77>>;<*A#NP   I kk\"#+ ,^B fRHHV$Xsl>W>~ = !B,6P DP DG+K *3' 23; ;(:;CcJIKsQRRR