oi(T dZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlmZddlmZddlmZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm!Z!ddlm"Z"ddlm#Z#ddlm$Z$ddlm%Z%ddlm&Z&ddlm'Z'ddlm(Z(ddlm)Z)ddlm*Z*ddlm+Z+gdZ,d Z-ej./d!ej0d"Z1ej./d!ej0d#Z2e3ed$Z4e3ed%Z5ej6d&Z7ej8Z9e j:d'kZ;e<Z=d(Z>ej?d)d*e@e jAiZBeBjCZCGd+d,ej?ZDeEFeDjGejHejIejJejKejLejMejNejNejOejPejQejRd- ZSejTejUejVejWejXejYejZej[ej\ej]ej^d. Z_d/Z`d0Zad1Zbe$d2Zc ecd3e_dn<#ee$r4Zfe d4efed5d6d7d7d7e_dYdZf[fndZf[fwwxYwejdZdd8Zgd9Zhd:Zie3ed;rejjZjejkZkd<Zld=Zmd>Znd?Zod@ZpdAZqej./dBsej./dCrdDZrndEZrejsZsGdFdGeeZtGdHdIZueuZvd^dKZwdLZxdMZyejzZzd_dOZ{GdPdQZ|d_dRZ}dSZ~dTZdUZdVZdWZdXZdYZdZZd[ZGd\d]ZdS)`zLinux platform implementation.N) defaultdict) namedtuple)_common)_ntuples)_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_LINKceZdZdZdZdZdZdS) IOPriorityrrN)__name__ __module__ __qualname__r r!r"r#?C:\PYTHON\Scheduler\python\Lib\site-packages\psutil/_pslinux.pyr9r9ds&OOr@r9) RSDTtZXxKWIP) 0102030405060708090A0Bct|ts J|tj|}|dd}|drt |s |dd}|S)zWrapper around os.readlink().r (deleted)N) isinstancestrosreadlinksplitendswithrpaths rAr`r`s dC &&$&& ;t  D ::f  a D }}\""+=d+C+CDSDz Kr@c(tjdtjdtjdi}||tjtjztjzz}|tjzr|ddd}|dd}|S)zZConvert file's open() flags into a readable string. Used by Process.open_files(). rwzw+arzr+)r_O_RDONLYO_WRONLYO_RDWRO_APPENDreplace)flags modes_mapmodes rAfile_flags_to_moderqswc2;RYEI UbkBK7")CD ED r{)||Ca(( <<d # #D Kr@c|dd}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)rmr_accessF_OK)nameincluding_virtualrds rAis_storage_devicerysX <<S ! !D+#T##*T*** 9T27 # ##r@ct|d5}|dd}dddn #1swxYwYgd}t|}|dkr|d|dkr|d|d kr|d t d |S) zReturn 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)usernicesystemidleiowaitirqsoftirqsteal guest guest_nice scputimes)rreadlineralenappendr) procfs_pathfvaluesfieldsvlens rA_scputimes_ntuplers  *** + +*q##%%abb)*************** K K KF v;;D qyy g qyy g rzz l### k6 * **s/AAA/proczignoring exception on import: rzuser system idlec|d}||ddz} |d}|d}|d}n6#t$r)}t|jdd|cYd}~Sd}~wwxYw t t d }n#t $r|cYSwxYwd}|5|D]U} | } | d r*|t| d z }V dddn #1swxYwY|tz}||z } ||z} | t| d z |z} | | z } | |t|d z |z z } t| S)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 /zoneinfoslowrr:g@) getKeyErrorrargsrrOSErrorstrip startswithintraPAGESIZEmin) memsfreefallbacklru_active_filelru_inactive_fileslab_reclaimableerrr watermark_lowlineavail pagecaches rAcalculate_avail_vmemrs<  Ddhhz1---H /0 !34 01  x{ > > >      ?,,777 8 8 M 66 6 6D::<a8888 9        s;A++A/2A/B!B43B48C!C>=C>D E DE !EE EE E  E!E:9E:>F GF-,G-!GGGGGG$$ G32G37HH10H1c>i}ttd5}|D]7}|}t|ddz||d<8 dddn #1swxYwY |d}|d}n5#t$r(t j\}}}}}}}||z}||z}YnwxYw||z }t||d} ttd }|5dx} } |D]}|d r/t|d dd zdz} nC|d r.t|d dd zdz} | | n(d} | dz } tj | tddx} } dddn #1swxYwYn=#t$r0} d| d} tj | tddx} } Yd} ~ nd} ~ wwxYwtj|||| | | S)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 0r:rzM'sin' and 'sout' swap memory stats couldn't be determined and were set to 0 ())rrrarrcext linux_sysinforrrrrrrsswap)rrrrrr_unit_multiplierrrsinsoutrrs rA swap_memoryrs D ))333 4 44 4 4DZZ\\F!&)nnt3DOO 4444444444444444 ]#L!    373E3G3G01aE4    4D?t'7E E88 c>a@@@@d%                 703 7 7 7   c>a8888dddddd8 9UD$d ; ;;sN;A))A-0A-5B/B87B8G 3B>F==GG H&G>>H heap_infocDt}t|d5}|}dddn #1swxYwY|dt t jjdz}d|D}t j|S)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. r{Nrc<g|]}t|tz Sr?float CLOCK_TICKS.0rIs rA zcpu_times..s# 5 5 5eAhh$ 5 5 5r@)rrrrarrr_fields)rrrrs rA cpu_timesrs"##K  *** + +&q##%%&&&&&&&&&&&&&&& ACM122Q66 7F 5 5f 5 5 5F =& !!s'AAAct}g}t|d5}||D]}|drl|}|dt t jjdz}d|D}t j|}| ||cdddS#1swxYwYdS)zfReturn a list of namedtuple representing the CPU times for every CPU available on the system. r{scpurc<g|]}t|tz Sr?rrs rArz!per_cpu_times..s#AAAQ%(([0AAAr@N) rrrrrarrrrr)rcpusrrrrentrys rA per_cpu_timesrs"##K D  *** + + q  # #Dv&& #C (=$>$>$B BCAA&AAA v. E"""                  sBC  CCcN tjdS#t$rd}tt d5}|D].}|dr|dz }/ dddn #1swxYwY|dkrtjd}tt d5}|D]7}| d d}| |r|dz }8 dddn #1swxYwY|dkrYdS|cYSwxYw) z0Return the number of logical CPUs in the system.SC_NPROCESSORS_ONLNr/cpuinfos processorrNzcpu\dr{ ) r_sysconf ValueErrorrrlowerrrecompilerramatch)numrrsearchs rAcpu_count_logicalrsz/000  O--777 8 8 A  ::<<**<881HC                 !88Z))Fo//66677 !1!!D::c??1-D||D))!q! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !8844 -s]+D$2B4 D$B D$B ;D$;D ? D$ D D$D  D$D$#D$cPt}d}d}tj|ptj|D]b}t|5}||dddn #1swxYwYct |}|dkr|Si}i}ttd5}|D]}|}|s& |d||d<n#t$rYnwxYwi}P| dr+| d d \} } t| || < dddn #1swxYwYt|}|pdS) 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)rrs :r)setglobraddreadrrrrrrrarsumr) lsp1p2rdrresultmapping current_inforkeyvalues rAcpu_count_coresr4s4 B EB JB " .2%%    %! FF16688>>## $ $ $ % % % % % % % % % % % % % % % WWF {{ GL ))333 4 4/ / /D::<<%%''D /TsI :BB B -E8DE8 D$!E8#D$$AE88E<?E<c2ttd5}d}d}d}|D]}|dr(t|d}ny|dr(t|d}n<|dr't|d}|||ndddn #1swxYwYd}t j||||S)z*Return various CPU stats as a named tuple.r{Nsctxtrsintrssoftirqr)rrrrrar scpustats)r ctx_switches interruptssoft_interruptsrsyscallss rA cpu_statsr ^sO ))000 1 1Q    Dw'' 7"4::<<?33 )) 7 a11 ,, 7"%djjll1o"6"6(#/*!"H =z?H M MMsC C55C9<C9cttd5}d|DcdddS#1swxYwYdS)z7Return current CPU frequency from cpuinfo if available.rcg|]R}|d)t|dddSS)scpu mhz:r)rrrra)rrs rArz)_cpu_get_cpuinfo_freq..xs_   zz||&&z22 $**T1%%a( ) )   r@N)rr)rs rA_cpu_get_cpuinfo_freqrus ))333 4 4                        s 8<<z'/sys/devices/system/cpu/cpufreq/policy0z$/sys/devices/system/cpu/cpu0/cpufreqc t}tjdptjd}|dg}tjj}t |D]O\}}t|t|kr ||dz}nt||dd}|st||d d}|Vd |d }t|dd kr*| tj d d d d}t|t|dz }tt||ddz } tt||ddz } | tj || | Q|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]*/cpufreqcjttjd|S)Nz[0-9]+)rrrgroup)rIs rAzcpu_freq..s&RYy!%<%<%B%B%D%D!E!Er@)riscaling_cur_freqNrcpuinfo_cur_freqz/sys/devices/system/cpu/cpuz/onlinez0 rz!can't find current frequency filescaling_max_freqscaling_min_freq)rrsortr_rdr enumeraterrrrrscpufreqNotImplementedErrorr) cpuinfo_freqspathsretpjoinirdcurr online_pathrmax_min_s rAcpu_freqr&s .//  :  D YB C C   EE FFF  '' 7 7GAt5zzS////%Q'$.EE$(:;;dKKK|EE$(:;;dKKK<"J"J"J"JK;666%?? 3<S##>#>??? =C-c222t99t#DtEE$(:;;<<==DDtEE$(:;;<<==DD JJs|D$55 6 6 6 6 r@c2dtDS)z}Alternate implementation using /proc/cpuinfo. min and max frequencies are not available and are set to None. c:g|]}tj|ddS)r)rrrs rArzcpu_freq..s&KKKa QS))KKKr@)rr?r@rAr&r&s LK3H3J3JKKKKr@ceZdZdS)_Ipv6UnsupportedErrorN)r<r=r>r?r@rAr*r*sDr@r*creZdZdZdZdZdZedZed dZ ed dZ d d Z dS) 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 Ldtjtjf}dtjtjf}dtjtjf}dtjtjf}dtjdf}|||||f||f|f|f||f|f|f|f||||f||f||fd |_d|_dS)Ntcptcp6udpudp6unix) allr.tcp4r/r0udp4r1r2inetinet4inet6)socketAF_INET SOCK_STREAMAF_INET6 SOCK_DGRAMAF_UNIXtmap _procfs_path)selfr4r/r5r1r2s rA__init__zNetConnections.__init__sv~v'9:);<v~v'89):;-$dD1$<GG$<GGG4t,D\D\    !r@ctt}tj|jd|dD]} t |jd|d|}|dr<|dddd}|||t|fq#ttf$rYt$rI}|j tj krYd}~|j tjkrt|Yd}~Ђd}~wwxYw|S)Nrs/fd/fd/zsocket:[r)rlistr_listdirr@r`rrrFileNotFoundErrorProcessLookupErrorrerrnoEINVAL ENAMETOOLONGr)rApidinodesfdinoders rAget_proc_inodeszNetConnections.get_proc_inodessAT""* 1< ("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?asciiNrFz>4Iz<4I)rarencoder9r: LITTLE_ENDIAN inet_ntopbase64 b16decoder<structpackunpackrrr*raddr)refamilyipports rAdecode_addresszNetConnections.decode_address s}"::c??D4}} 2 YYw   V^ # # D%ff.>r.B.B44R4.HII%ff.>r.B.BCC!"%%B  ) EEFM%,D,DEEEBB  ) EEFM%,D,DEEEB   $:/T9   xD!!!s B E"E6Nc #K|dr!tj|sdSt |5}|t |dD]\}} |dd\ }} } } }}}}}} n)#t$rd|d|d|} t| dwxYw| |vr|| d\}}nd \}}|||kr{|tj krt| } n tj} t| |} t| |} n#t"$rYwxYw|||| | | |fV ddddS#1swxYwYdS) z.Parse /proc/net/tcp* and /proc/net/udp* files.6Nrrerror while parsing ; malformed line rrNrF)rbr_rdexistsrrrrar RuntimeErrorr9r; TCP_STATUSESr CONN_NONEr,rir*)filerftype_rO filter_pidrlinenorrladdrraddrstatusrQrrNrPs rA process_inetzNetConnections.process_inet=sI ==   bgnnT&:&:  F t__# I JJLLL )!Q! I! I  6 SbS)BAueVQ1aEE"666.t.."..%)..'s++5 6 F??%UmA.GC&GC)jC.?.? 222!-f!5!(!2! . = =eV L L . = =eV L L0!!! !vueUFCHHHHHC! I# I# I# I# I# I# I# I# I# I# I# I# I# I# I# I# I# I# IsO*E43'BE4&CAE46E  E4 EE4EE44E8;E8c #$Kt|5}||D]}|} |dd\}}}}}}} n+#t$rd|vrY:d|d|} t | wxYw| |vr || } ndg} | D]e\} } ||| krt |dkr|d nd }t jt|}d }t j }| |||||| fVf ddddS#1swxYwYdS) zParse /proc/net/unix files.rrrlrmrnNrrF) rrrarrprrsocktype_to_enumrrr)rsrfrOrurrtokensrrtrQrpairsrNrPrdrxrys rA process_unixzNetConnections.process_unixhst__ L JJLLL L L ,281+/Aq!Qq%%!,,,$ NtNNdNN's+++,F??#5MEE'LE$ L LGC!-*2C2C -0[[A-=-=vbzz2 ' 8U D D!#!(!2!65$vsKKKKK L% L L L L L L L L L L L L L L L L L L Ls6-DADA;!D#A;;A__doc__rBrRrX staticmethodrirzrrr?r@rAr,r,s  !!!.4 0"0"\0"d(I(I(I\(IT!L!L!L\!LFr@r,r6c6t|S)z$Return system-wide open connections.)_net_connectionsr)rs rAnet_connectionsrs  $ $T * **r@cttd5}|}dddn #1swxYwYi}|ddD]}|d}|dksJt ||d|}||dzd}tt|\}}} } } } } }}}}}}}}}||||| || |f||<|S)zsReturn network I/O statistics for every network interface installed on the system as a dict of raw tuples. z/net/devNr:rZrr) rr readlinesrfindreprrramapr)rlinesretdictrcolonrwr bytes_recv packets_recverrindropin_fifoin_framein _compressedin _multicastin bytes_sent packets_senterroutdropout_fifoout_collisionsout _carrierout_compressedouts rAnet_io_countersrsy o''111 2 2a Gabb $ $  3qyyy$t**yyyFUF|!!##eaikk"((**0022* V  '                            NsAAAc*tjttjttjt i}t}i}|D]} tj |}tj |}tj |\}}d |}d|v} tj| |||||||<}#t$r/} | jt jkrt%| Yd} ~ d} ~ wwxYw|S)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 snicstatsrrKENODEVr) duplex_mapnamesrrwmturnduplexspeed output_flagsisuprs rA net_if_statsrs / / /J    " " $ $E C /$''C%d++E 4T::MFE88E??L%D j(%lCII   yEL(( #JJJJJJJJ   Js?C D!%D  DFc d}d}tjtdr |}nJtjdr |}n td}t |i}|D]C}|\ }}} } } } } }}}|st |s!| t z} | t z} || | | | | |||f ||<D|S)zcReturn disk I/O statistics for every disk installed on the system as a dict of raw tuples. c 3Kttd5}|}dddn #1swxYwY|D] }|}t |}|dkrF|d}t |d}t t |dd\ }}} } } } } }}}n|dks|dkr2|d}t t |dd\ }}}} } } } } }}}nO|dkr5|d}t t |dd\}}} } d x} x} x}x} }nd |}t|||| || | | || |f VdS) N /diskstatsr;r:rr|rznot sure how to interpret line )rrrrarrrr)rrrrflenrwreads reads_mergedrbytesrtimewrites writes_mergedwbyteswtimer busy_timers rA read_procfsz%disk_io_counters..read_procfs s"/++777 8 8 "AKKMME " " " " " " " " " " " " " " " ; ;DZZ\\Fv;;DrzzayF1I69#vad|6L6L4vufmE1itrzzay69#vad|6L6L4 feV]E1iay03C0D0D-vvvKLLLL L}yy@@@ oo%u ; ; ; ; ;/ ; ;sAA Ac 3\KtjdD]}tjtjd|D]\}}}d|vr t tj|d5}|}dddn #1swxYwYtj |}tt|dd\ }}} } } } } }}}||| | | | ||| |f VސdS)N /sys/blockstatr) r_rHwalkrdrrrrrabasenamerr)blockrootrfilesrrrwrrrrrrrrrs rA read_sysfsz$disk_io_counters..read_sysfs7sZ -- F FE"$'"',,|U*K*K"L"L F Fa&&rw||D&99::6aVVXX^^--3355F666666666666666w''--47sF3B3K3H3H1 feV]E1iUFFFElM9FFFFF F F Fs9C  C C rrz6/diskstats nor /sys/block are available on this system)r_rdrorrryDISK_SECTOR_SIZE)perdiskrrgenrrrrwrrrrrrrrrs rAdisk_io_countersrs; +;+;+;\ F F F w~~**66677 'kmm  % %'jll      "#&&&GAA). &ufffeUL 9 066  """"u%}iA  Nr@c8eZdZdZddgZdZdZdZdZdZ d S) 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||_dSNrs)r_rst_devrr)rAdevs rArBzRootFsDeviceFinder.__init__ws4gcll!Xc]] Xc]] r@c.ttd5}|ddD]}|}t |dkr*|drt |dnd}|drt |dnd}|d}||jkr ||jkr|rd|ccdddS ddddS#1swxYwYdS)Nz /partitionsr:rrrr;/dev/) rrrrarisdigitrrr)rArrrrrrws rAask_proc_partitionsz&RootFsDeviceFinder.ask_proc_partitions|sv /++888 9 9 .Q abb) . .v;;??*0)*;*;*=*=GF1I4*0)*;*;*=*=GF1I4ayDJ&&5DJ+>+>.-t~~-- . . . . . . . . . . . . . . . . . . . . . . . . . . .sCD ;D  DDc6d|jd|jd}t|5}|D]Y}|drB|dd}|rd|ccdddSZ ddddS#1swxYwYdS)Nz/sys/dev/block/rZz/ueventzDEVNAME=r:r)rrrrr rpartition)rArdrrrws rAask_sys_dev_blockz$RootFsDeviceFinder.ask_sys_dev_blocksAAAdjAAA t__ . . .??:...::<<22:>>qAD.-t~~--  . . . . . . . . . . . . . . . . . . . . . . . . . . .sAB?BBBc|jd|j}tjd}|D]} t |}|5|}||krOtj tj |}d|cdddcS dddn #1swxYwY#t$rYwxYwdS)NrZz/sys/class/block/*/devr) rrriglobrrrr_rdrdirnamerI)rAneedlerrsrdatarws rAask_sys_class_blockz&RootFsDeviceFinder.ask_sys_class_blocksSJ---- 344 . .D .dOO..6688>>++Dv~~!w//0E0EFF-t~~ ..........%...............%     . .s#CA-CC C  CCcd}|< |}n&#t$r}t|Yd}~nd}~wwxYw|< |}n&#t$r}t|Yd}~nd}~wwxYw|< |}n&#t$r}t|Yd}~nd}~wwxYw|!t j|r|SdSdSrT)rrrrrr_rdro)rArdrs rAfindzRootFsDeviceFinder.finds( < //11   c   < --//   c   < //11   c    t 4 4 K    s@ >9>A A<#A77A<B B:!B55B:N) r<r=r>r __slots__rBrrrrr?r@rArrmsu'"I### . . .... . . .r@rct}t}|st|d5}|D]}|}|ds(||S|dd}|dkr|d dddn #1swxYwY|dkr?tj dr tj d}n"tj |d }g}tj |}|D]l} | \} } }} | d krd } | d vr"tp| } |s| r||vr@tj| | || } || m|S) z8Return mounted disk partitions as a list of namedtuples.z /filesystemsnodev rzfsNrz /etc/mtabz /self/mountsnoner}> /dev/rootrootfs)rrrrrrrar_rdisfilerealpathrdisk_partitionsrrr sdiskpartr)r3fstypesrrrfstype mounts_pathretlist partitions partitiondevice mountpointoptsntuples rArrseeG!##K  + +333 4 4 + + +zz||w//+KK ----"ZZ--a0F E*** + + + + + + + + + + + + + + + +g"'.."="=g&&{33 g&&+'C'C'CDD G%k22J   +4( FD V  F , , ,'))..00:FF  V722vz64@@v NsB C  CCc tjt}tjd}|tjdt d|D}tjd}t jd}|D]1}|d|}||vr| |2|D][} |dz}tt|dz }tj tj |d }t!|} n#t$t&f$rYwxYwt|d zd } t|d zd } t!|dzd } | & t| dz } n#t&$rd } YnwxYw| & t| dz } n#t&$rd } YnwxYw||  | || | f]|s;tjd}t t)|}|D]} tj |d}tt|dz }tj |d}t!|} n-#t$t&f$r} t+| Yd } ~ d } ~ wwxYwtj|dz}d|D}d } d } |D] }tj ||dz}t!|d }|dkr3ttj ||dzd } n8|dkr2ttj ||dzd } | & t| dz } n#t&$rd } YnwxYw| ' t| dz } #t&$rd } YwxYw ||  d|| | f t-|S)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*_*cDh|]}|ddSrrrars rA z'sensors_temperatures..&;;;A Q;;;r@z5/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*z'/sys/devices/platform/coretemp.*/hwmon/z/sys/class/hwmon/_inputg@@rw_maxNr_crit_labelr}z /sys/class/thermal/thermal_zone*temptypez /trip_point*ch|]O}dtj|dddPS)rrr;)rr_rdrra)rps rAr z'sensors_temperatures..8s[))!,,22377!<==r@_typecritical_temphigh) collectionsrrGrextendsortedrrsubrrrr_rdrrrrrrrrdict)r basenames basenames2replrwaltnamebaserdcurrent unit_namerrlabelr trip_paths trip_points trip_point trip_types rAsensors_temperaturesr*s  !$ ' 'C ;<>DD ))II$    H D6MD111w666D8Ob1117799   T{{V+        ??V3     IugtX>???? ,AI@AA 3y>>** ( A( AD w||D&11T ++f4w||D&11IIOO-- Z(   c  4.#899J#KHD) ( ( w||D*w*>??r22288::  **# T:+?@@4   HH&(( T:+?@@4D#$$T{{V3%$$$#$'(#(??V#;%(((#'((  N ! !2wh"? @ @ @ @ 99stBEE'&E';G GG#G66 HH"BK##L 4LL 6P  PPP11 QQctjt}tjd}|stjd}t d|D}|D]} t t |dz}n&#t$r}t|Yd}~Ad}~wwxYwttj tj |d}t|dzd }||t!j||t%|S) aReturn hardware fans info (for CPU and other peripherals) as a dict including hardware label and current speed. 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 z/sys/class/hwmon/hwmon*/fan*_*z%/sys/class/hwmon/hwmon*/device/fan*_*cDh|]}|ddSr r rs rAr zsensors_fans..kr r@r Nrwrr}r)rrrGrrrrrrrr_rdrrrrrsfanr)rrr"r#rr$r%s rA sensors_fansr.ZsM  !$ ' 'C :;;I GIEFF ;;;;;<.multi_bcats ' 'Dtd+++Cd{{'s88OOO!'''99;;&&&&&' ts/AAchg|]/}|dsd|v-|0S)BATbattery)rrrs rArz#sensors_battery..sK    <<   #,qwwyy"8"8 "8"8"8r@Nz /energy_nowz /charge_nowz /power_nowz /current_nowz /energy_fullz /charge_fullz/time_to_empty_nowgY@rz /capacityrFrz AC0/onlinez AC/onliner/statusr} dischargingF>fullchargingTi<r)objectr_rHPOWER_SUPPLY_PATHrdrrZeroDivisionErrorrrrrrPOWER_TIME_UNLIMITEDabsPOWER_TIME_UNKNOWNrsbattery) r2batsr energy_now power_now energy_full time_to_emptyr power_pluggedonlinerysecsleftr1s @rAsensors_batteryrJys 88D       -..   D t 7<<)3t99 5 5DD=0$2FGGJ 4,.~0EFFI*TN2D>4IJJKJt&::;;M:#9 j(;6GG    GGG c$,r:::;; b==4 M Z  & 55  & 44F! TI%33399;;AACC ] " "!MM + + + M  ./  I$9 2:I6=>>HH  2 2 21HHH 2  "}r)** a<<1H- <= 9 99s$7C CC3"GG/.G/cg}tj}|D]9}|\}}}}}tj||pd|||}||:|S)z:Return currently connected users as a list of namedtuples.N)rusersrsuserr) rrawlistitemr|ttyhostnametstamprNnts rArLrLsfGjllG+/(c8VS YtS[D(FC @ @r Nr@cHtd}t|5}|D]^}|drGt|dccdddS_d|}t |#1swxYwYdS)zAReturn the system boot time expressed in seconds since the epoch.r{sbtimerNzline 'btime' not found in )rrrrrrarp)rdrrrs rA boot_timerUs & & &D T   a 6 6Dx(( 6TZZ\\//11!45555         614113           sABBBBctt}dtj|DS)z7Returns a list of PIDs currently running on the system.cTg|]%}|t|&Sr?)rrrs rArzpids..s+ < < .wrapper5s HdjT 3t-d---f-- - 3 3 3sD))s 2! 4 4 4  ! ! # # #T** 3      ! ! # # #7>>T%6"C"C"C"C"CDD 8#C..C7  s+  C 8 C %A** C 7ACC ) functoolswraps)rfrgs` rAwrap_exceptionsrj0s: _S$ Nr@ceZdZdZgdZdZdZdZdZe fdZ e e dZ e e d Ze e d Zd Zd Ze d Ze dZe dZe dZe dZejdejdr e dZe dZe dZe d=dZe d>dZe dZ e!se"rHdZ#e e$j%de$j%de$j%dfd Z&e d!Z'ne Z'e"r e d"Z(e d#Z)e e$j%d$fd%Z*e e$j%d&fd'Z+e d(Z,e d)Z-e d*Z.e/r)e d+Z0e$j%d,fd-Z1e d.Z2e3re d/Z4e d0Z5e6e7d1r e d=d2Z8e d3Z9e d4Z:e d?d6Z;e d7Ze e$j%d;fd<Z?dS)@ProcesszLinux process implementation.)_cache_ctimerc_ppidr@rNcd||_d|_d|_d|_t |_dSrT)rNrcrornrr@)rArNs rArBzProcess.__init__Ws2   +--r@c t|jd|jd}|d}||dz|dz}|dkS#t$rYdSwxYw)Nrsr{r\r:r;ZF)rr@rNrr)rArr]rys rA _is_zombiezProcess._is_zombie^s "4,>>tx>>>??D::d##D$(TAX-.FT> !    55 sA AAcn|r t|j|j|jdSrT)rsrrNrcrorAs rArdzProcess._raise_if_zombiens9 ??   B$*djAA A B Br@cLtj|jd|jdS)z+Raise NSP if the process disappeared on us.rsN)r_rr@rNrus rA_raise_if_not_alivezProcess._raise_if_not_alivers- 4$11tx1122222r@c t|S#ttf$rQtj|jd|jr!||tur|cYSwxYwr) r`rIrJr_rdlexistsr@rNrdUNSET)rArdrs rA _readlinkzProcess._readlinkxs D>> !!#56   w$"3@@dh@@AA $%%'''5((#OOO   sAA31A3c"t|jd|jd}|d}||ddz|}||dzd}i}||d<|d |d <|d|d <|d |d <|d|d<|d|d<|d|d<|d|d<|d|d<|d|d< |d|d<n$#t $rtdd |d<YnwxYw|S)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. rsr{r\(rr:Nrwrryr_rttynr utime stime children_utimerchildren_stime create_time$cpu_num' blkio_ticksz&can't get blkio_ticks, set iowait to 0)rr@rNrrra IndexErrorr)rArr]rwrrs rA_parse_stat_filezProcess._parse_stat_filesUt(::48:::;;zz$DIIdOOa'$./dQhjj!''))F q H QiF ayG bzG bzG &r   &r  #BZMI #!'C   # # # : ; ; ;!"C    #  s C++D  D ct|jd|jd5}|cdddS#1swxYwYdS)zRead /proc/{pid}/stat file and return its content. The return value is cached in case oneshot() ctx manager is in use. rsr6N)rr@rNrrArs rA_read_status_filezProcess._read_status_filesD-AAAAA B B a6688                  sAAAct|jd|jd5}|cdddS#1swxYwYdS)Nrsr0)rr@rNrrrs rA_read_smaps_filezProcess._read_smaps_filesD-@@@@@ A A $Q6688>>## $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $s&AAAc|j||j||j|dSrT)rcache_activaterrrus rA oneshot_enterzProcess.oneshot_entersM ,,T222 --d333 ,,T22222r@c|j||j||j|dSrT)rcache_deactivaterrrus rA oneshot_exitzProcess.oneshot_exitsM ..t444 //555 ..t44444r@cPt|dS)Nrw)rrrus rArwz Process.names#d++--f5666r@cP||jd|jddS)Nrsz/exer}rr{r@rNrus rAexez Process.exe8~~ 1 148 1 1 1B   r@ct|jd|jd5}|}dddn #1swxYwY|s|gS|drdnd}||r |dd}||}|dkr,t|dkrd|vr|d}|S)Nrsz/cmdlinerZrrFr)rr@rNrrdrbrar)rArrsepcmdlines rArzProcess.cmdlines' $+@@dh@@@ A A Q6688D                  ! ! # # #I f--6ff3 ==   9D**S// &==S\\Q..3$;;jjooGAAAct|jd|jd5}|}dddn #1swxYwYt |S)Nrsz/environ)rr@rNrr)rArrs rAenvironzProcess.environs $+@@dh@@@ A A Q6688D               "4(((rct|d}tj} ||S#t$rYdSwxYw)Nr~)rrrget_terminal_mapr)rAtty_nrr?s rAterminalzProcess.terminals_T**,,W566(** <    44 sA AAr//ioc >|jd|jd}i}t|5}|D]T}|}|r< |d\}}t |||<D#t $rYPwxYwU dddn #1swxYwY|s|d}t| tj |d|d|d|d|d |d S#t$r*}|j d d |d |}t |dd}~wwxYw)Nrsrs: z file was emptyssyscrssyscws read_bytess write_bytessrcharswcharrz field was not found in z; found fields are ) r@rNrrrarrrprpiorr) rAfnamerrrrwrrrs rA io_counterszProcess.io_counterss(8848888EFU## 6q 6 6D::<*8$8$  0 0 0x{..e..#)..!oo4/  0sMB A+B + A85B 7A88B  B B +z&Process.memory_info..Ws>88&'A!888888r@r|)rr@rNrrarpmem) rArvmsrssrtextlibrdirtys rA memory_infozProcess.memory_infoIsD-@@@@@ A A Q88+,::<<+=+=+?+?+C888 4CfdCu               xS&$T5AAAsAA--A14A1cdx}x}}t|jd|jd5}|D]}|dr.|t |ddzz }E|dr+t |ddz}|dr*t |ddz} dddn #1swxYwY|||fS) Nrrsr1sPrivate_rrPss:Swap:)rr@rNrrra)rAusspssswaprrs rA_parse_smaps_rollupzProcess._parse_smaps_rollup^sR ! C #$>>tx>>> ;;;D{33;s4::<<?33d::11;!$**,,q/22T922;"4::<<?33d:; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;d# #sCC;;C?C?s\nPrivate.*:\s+(\d+)s\nPss\:\s+(\d+)s\nSwap\:\s+(\d+)c|}ttt||dz}ttt||dz}ttt||dz}|||fS)Nr)rrrrfindall)rA _private_re_pss_re_swap_re smaps_datarrrs rA _parse_smapszProcess._parse_smapsus*..00Jc#{22:>>??@@4GCc#wz::;;<>EDd# #r@c"trI |\}}}nG#ttf$r|\}}}YnwxYw|\}}}|}t j||||fzSrT)HAS_PROC_SMAPS_ROLLUPrrJrIrrrpfullmem)rArrr basic_mems rAmemory_full_infozProcess.memory_full_infos$ 59%)%=%=%?%?NCdd*,=>999%)%6%6%8%8NCddd9"&!2!2!4!4S$((**I<c3-=!=> >s")A Acd}|}|s|gS|d}g}|d}|g}|||D]\}}|dd} |\} } } } } }n#t$r|dgz\} } } } } }YnwxYw|sd}nQt |}|}|drt|s |dd }t | t | || d d| d d| d d| d d| dd| dd| dd| dd| dd| ddf }| ||S)aReturn process's mapped memory regions as a list of named tuples. Fields are explained in 'man proc'; here is an updated (Apr 2012) version: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/filesystems/proc.txt?id=b76437579d1344b612cf1851ae610c636cec7db0. /proc/{PID}/smaps does not exist on kernels < 2.6.14 or if CONFIG_MMU kernel configuration option is not enabled. c3Ki}|D]}|dd}|dds.||fV||a t |ddz||d<#t t f$r3|ddrYd|}t |dwxYw||fVdS)NrrrrsVmFlags:z!don't know how to interpret line )rarbpoprrrrr)r current_blockrrrrs rA get_blocksz'Process.memory_maps..get_blockss!<>F NN6 " " " "  '  $ $ & & &s6B&''B B&B B&!B "B&&B<;B<c4tj|jSrT)rproc_priority_getrNrus rAnice_getzProcess.nice_get"s%dh///r@c6tj|j|SrT)rproc_priority_setrN)rArs rAnice_setzProcess.nice_set+s%dh666r@c4tj|jSrT)rr3rNrus rAcpu_affinity_getzProcess.cpu_affinity_get2s-dh77 7r@sCpus_allowed_list:\t(\d+)-(\d+)c f|}||}|rRttt |ddt |dddzSttt t S)Nrr)rrrGrangerrr)rA_rerrs rA_get_eligible_cpuszProcess._get_eligible_cpus6s))++DKK%%E 9E#eAhqk"2"2Ca 4D4Dq4HIIJJJE#moo"6"677888r@c  tj|j|dS#ttf$r}t |ts|jt jkr|}tttt}|D]:}||vrd|d|}t |d||vrd|d|}t ||;d}~wwxYw)Nz invalid CPU z; choose between z CPU number z! is not eligible; choose between ) rproc_cpu_affinity_setrNrrr]rKrLrtuplerrr)rArr eligible_cpusall_cpuscpurs rAcpu_affinity_setzProcess.cpu_affinity_setAs- *48T:::::Z(   c:..;#)u|2K2K$($;$;$=$=M$U3}+?+?%@%@AAH# ; ;h..!6s!6!6$1!6!6 #-S//t;m33!#+DHi@@@6{{a''5*055)oo-$TXy&AAAAA   9 ,,))+++  sA>AA>> B7*B22B7c|d}|}t|dS)Nry?)rr PROC_STATUSESr)rAletters rAryzProcess.statuss;&&((2  ---r@c@g}tj|jd|jd}d}|D]}|jd|jd|} t |}|dr1t |r!|jd|jd|} t|5}t| d}t| dd} dddn #1swxYwYt| } tj |t|t|| | } || T#tt f$rd}YjwxYwp#tt f$rd}Yt"$rK} | jt$jkrYd} ~ | jt$jkrt+| Yd} ~ Ԃd} ~ wwxYw|r||S) NrsrDFrEz/fdinfo/rrT)r_rHr@rNr`rrrrrrarqr popenfilerrIrJrrKrLrMrrw) rArrrrPrsrdrposrnrprrs rA open_fileszProcess.open_filess d/??$(???@@ & /& /B'<<$(<<<C$' (:(:(<(  '  $ $ & & &saF E?A4D E?D E?#D $E??FFH1 H:H$H?HHr6cnt||j}||SrT)rrrNrw)rArrs rArzProcess.net_connectionss0''dh77   """ r@cdttj|jd|jdS)NrsrD)rr_rHr@rNrus rAnum_fdszProcess.num_fdss02:!2BBTXBBBCCDDDr@cPt|dS)Nr_rrus rAr_z Process.ppids!4((**62333r@sUid:\t(\d+)\t(\d+)\t(\d+)c|}||d\}}}tjt |t |t |Sr)rrrpuidsr)rA_uids_rerreal effectivesaveds rAuidsz Process.uidsX%%''!)!1!1$!7!7!:iyTC NNCJJ???r@sGid:\t(\d+)\t(\d+)\t(\d+)c|}||d\}}}tjt |t |t |Sr)rrrpgidsr)rA_gids_rerr%r&r's rAgidsz Process.gidsr)r@rTFr6)@r<r=r>rrrBrsrdrwrzr{rjrrrrrrrwrrrrr_rdrogetpidrrrrrrrHAS_PROC_SMAPSrrrrrrrrrrrrHAS_CPU_AFFINITYrrrHAS_PROC_IO_PRIORITYr rhasattrrrryrrr r_r(r-r?r@rArlrlKs''I...""" BBB333 (- ##_#J_$$_$333 555 77_7  _ _2))_) _ w~~/yry{{///00#0  0 0  0D   _  77_7@@@_@)))_) BB_B$C'C' $ $ $. # #;<<BJ233RZ 455  $ $ $  $8  ? ?  ? ?'H E E  E N  _ " #<== 8 8 8_ 8*4"*5H*I*I555_5 _400_077_7&  8 8  8!bj!DEE 9 9 9 9     .B  / /  /  B B  Bwx##      6.._. --_-^_ EE_E44_4&BJ'DEE@@@_@ &BJ'DEE@@@_@@@r@rlr/r.)rr`renumrKrhrr_rrr9rbsysrrrr}rrrrr rr r r r rrrrrrrrrrrrrrrrr__extra__all__r<rdror0r1rr4r3r2rr getpagesizer byteorderr^r;rzrIntEnumr AF_PACKETr6r7r9globalsrV __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.rqr`rqryrr Exceptionrrrrr heap_trimrrrrr rr& net_if_addrsr*r,rrrr disk_usagerrrr*r.rJrLrUrUrYr`rjrlr?r@rArMs1 %$    ######""""""######$$$$$$$$$$$$''''''!!!!!!""""""""""""$$$$$$""""""++++++ ((((((''''''""""""""""""   $. < < < <=='J  'J'J'JKKwt%67774!899bj&& 4    )  iV%5!6!67    '(((     "    $        !         "  "           !         ((   $$$& ++ +0O%%g..CMMOOO E 23 2 2333?JJ{,>??S#NNCMMMMMMO M <<<~~~~B4<4<4>;<</L*AA/L####NLLL      I   iiiiiiiiX">##++++ ,,,^B ffffRHHHHHHHHV$$$$Xsssl>W:W:W:~   === !!!B,6R @R @R @R @R @R @R @R @R @R @sJK*K  K