Viewing File: /opt/alt/python38/lib64/python3.8/site-packages/psutil/__pycache__/_pslinux.cpython-38.opt-1.pyc

U

=_@@s@dZddlmZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlmZddlmZddlmZddlmZdd	lmZdd
lmZddlmZddlmZdd
lmZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm!Z!ddlm"Z"ddlm#Z#ddlm$Z$ddlm%Z%ddlm&Z&ddlm'Z'ddlm(Z(ddlm)Z)ddl*m+Z+ddl*m,Z,ddl*m-Z-dd l*m.Z.dd!l*m/Z/dd"l*m0Z0ej1d#krddl2Z2ndZ2d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3gZ3d4Z4ej56d5e7Z8e9ed6Z:e9ed7Z;e<Z=e>d8Z?e@ZAdaBe0rhd9nd:ZCejDd;kZEd<ZFe2dkre
jGZHne2Id=d>eJe
jGiZKeKjHZHe2dkrdZLdZMd?ZNd@ZOn GdAdBdBe2jIZPeQRePjSejTejUejVejWejXejYejZejZej[ej\ej]ej^dCZ_ej`ejaejbejcejdejeejfejgejhejiejjdDZkedEdFdGdHdIdJdKdLdMdNdOdPgZledQdRdSdTdUdVdWdXdYdZg	Zmed[d\d]d^d_d`gZnedadbZoedceojpddZqeded\dfdgdhdidjdkdldmdndogZredpdqdrserjpZtedsdRdSdTdUdtdugZuedvdwdxdydzd{gZvd|d}Zwd~dZxddZyeddZze=dfddZ{zezdWn0e|k
re
}eddddda~YnXdZzddlmZWnBek
rddlZejdddZe9edrdddZYnXedk	re3ddeeDddZddZddZddZddZddZddZddZej56ds\ej56drfddZn ej56dr~ddZnddZejZGddde|ZGdddZeZdddZddZddZejZdddZdddZddZddZddZddZddZddÄZddńZddDŽZddɄZGdd˄de<ZdS)zLinux platform implementation.)divisionN)defaultdict)
namedtuple)_common)_psposix)
_psutil_linux)
_psutil_posix)AccessDenied)debug)decode)get_procfs_path)
isfile_strict)memoize)memoize_when_activated)NIC_DUPLEX_FULL)NIC_DUPLEX_HALF)NIC_DUPLEX_UNKNOWN)
NoSuchProcess)open_binary)	open_text)parse_environ_block)path_exists_strict)
supports_ipv6)
usage_percent)
ZombieProcess)b)
basestring)FileNotFoundError)PermissionError)ProcessLookupError)PY3)ZPROCFS_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_ACKCONN_LISTENCONN_CLOSINGz/sys/class/power_supplyz/proc/%s/smapsproc_ioprio_getproc_cpu_affinity_get
SC_CLK_TCKi littlei
AddressFamilyAF_LINKr"c@seZdZdZdZdZdZdS)
IOPriorityrrr:r"N)__name__
__module____qualname__r$r%r&r'r?r?B/opt/alt/python38/lib64/python3.8/site-packages/psutil/_pslinux.pyr;wsr;)RSDTtZXxKWIP)Z01Z02Z03Z04Z05Z06Z07Z08Z09Z0AZ0Bsvmemtotal	availablepercentusedfreeactiveinactivebufferscachedsharedslabsdiskioZ
read_countZwrite_countZ
read_bytesZwrite_bytesZ	read_timeZ
write_timeZread_merged_countZwrite_merged_count	busy_time	popenfilepathfdZpositionmodeflagspmemz"rss vms shared text lib data dirtypfullmem)usspssswap
pmmap_groupedrsssizercZshared_cleanZshared_dirtyZ
private_cleanZ
private_dirtyZ
referencedZ	anonymousrd	pmmap_extzaddr perms  pioZ
read_charsZwrite_chars	pcputimesusersystem
children_userchildren_systemiowaitcCs:t|}|dd}|dr6t|s6|dd}|S)zWrapper around os.readlink().r
 (deleted)N)osreadlinksplitendswithr)r\r?r?r@rus

rucCsXtjdtjdtjdi}||tjtjBtjB@}|tj@rH|ddd}|dd}|S)zZConvert file's open() flags into a readable string.
    Used by Process.open_files().
    rwzw+arzr+)rtO_RDONLYO_WRONLYO_RDWRO_APPENDreplace)r_Z	modes_mapr^r?r?r@file_flags_to_modes
rcCs4|dd}d}|rd|}nd|}t|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/%sz/sys/block/%s/device)rrtaccessF_OK)nameZincluding_virtualr\r?r?r@is_storage_devices

rc	Cstd|}|dd}W5QRXdddddd	d
g}t|}|dkrX|d|d
krj|d|dkr||dtd|adS)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.
    %s/statrNrlnicermZidlerpZirqZsoftirqZsteal	Zguest
Z
guest_nice	scputimes)rreadlinervlenappendrr)procfs_pathfvaluesfieldsZvlenr?r?r@set_scputimes_ntuples	


rTc
Csjz:|rt|nt|}|W5QRWSQRXWn*ttfk
rd|tk	r^|YSYnXdS)zReturn file content.
    fallback: the value returned in case the file does not exist or
              cannot be read
    binary: whether to open the file in binary or text mode.
    N)rrreadstripIOErrorOSError_DEFAULT)fnamefallbackbinaryrr?r?r@cats$r/procrzuser system idle)prlimit)Z	use_errnorcCsGdddtj}|}|dkr8t||dt|}n6|}|d|_|d|_t||t|t|}|dkrt}t|t	
||j|jfS)Nc@s eZdZdejfdejfgZdS)zprlimit.<locals>.StructRlimitrlim_currlim_maxN)r<r=r>ctypesZ
c_longlongZ_fields_r?r?r?r@StructRlimitJsrrr)rZ	StructurelibcrZbyrefrrZ	get_errnorrtstrerror)pid	resource_limitsrcurrentretnewerrnor?r?r@rIs"

cCs"g|]}|dr|r|qS)ZRLIM)
startswithisupper.0rHr?r?r@
<listcomp>bs
rc	Cs|d}||dd}z|d}|d}|d}Wntk
rL|YSXztdt}Wntk
rx|YSXd}|6|D]*}|}|dr|t|d	7}qW5QRX|t	9}||}	||}
|
t
|
d
|8}
|	|
7}	|	|t
|d|7}	t|	S)aFallback for kernels < 3.14 where /proc/meminfo does not provide
    "MemAvailable:" column, 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

    XXX: on recent kernels this calculation differs by ~1.5% than
    "MemAvailable:" as it's calculated slightly differently, see:
    https://gitlab.com/procps-ng/procps/issues/42
    https://github.com/famzah/linux-memavailable-procfs/issues/2
    It is still way more realistic than doing (free + cached) though.
    MemFree:Cached:rs
Active(file):sInactive(file):
SReclaimable:z%s/zoneinfoslowrr:g@)getKeyErrorrr
rrrintrvPAGESIZEmin)memsrRrZlru_active_fileZlru_inactive_fileZslab_reclaimablerZ
watermark_lowlineavailZ	pagecacher?r?r@calculate_avail_vmemjs2


 rcCsg}i}tdt0}|D]$}|}t|dd||d<qW5QRX|d}|d}z|d}Wn"tk
rd}|dYnXz|d	}Wn"tk
rd}|d
YnX||dd7}z|d}	WnHtk
r z|d
}	Wn$tk
rd}	|dYnXYnXz|d}
Wn$tk
rRd}
|dYnXz|d}WnXtk
rz|d|d|d}Wn$tk
rd}|dYnXYnXz|d}Wntk
rd}YnX||||}
|
dkr||}
z|d}Wntk
r.t|}YnX|dkrHd}|d||krV|}t|||dd}|rdd	|t
|dkrdndf}t|t
t||||
||
||||	|S)aReport virtual memory stats.
    This implementation matches "free" and "vmstat -s" cmdline
    utility values and procps-ng-3.3.12 source was used as a reference
    (2016-09-18):
    https://gitlab.com/procps-ng/procps/blob/
        24fd2605c51fccc375ab0287cec33aa767f06718/proc/sysinfo.c
    For reference, procps-ng-3.3.10 is the version available on Ubuntu
    16.04.

    Note about "available" memory: up until psutil 4.3 it was
    calculated as "avail = (free + buffers + cached)". Now
    "MemAvailable:" column (kernel 3.14) from /proc/meminfo is used as
    it's more accurate.
    That matches "available" column in newer versions of "free".
    
%s/meminforrs	MemTotal:rsBuffers:rUrrVrsShmem:s
MemShared:rWsActive:rSs	Inactive:sInact_dirty:sInact_clean:sInact_laundry:rTsSlab:s
MemAvailable:rOZround_z6%s memory stats couldn't be determined and %s set to 0, ZwasZwere)rr
rvrrrrrrjoinrwarningswarnRuntimeWarningrM)Zmissing_fieldsrrrrrNrRrUrVrWrSrTrXrQrrPmsgr?r?r@virtual_memorys$

	


rc
Csi}tdt0}|D]$}|}t|dd||d<qW5QRXz|d}|d}Wn:tk
rt\}}}}}}}||9}||9}YnX||}t||dd}	ztdt}WnDtk
r}
z$d	t	|
}t
|td}}
W5d
}
~
XYnX|d
}}
|D]n}|
drDt|ddd
d}n&|
drjt|ddd
d}
|d
k	r|
d
k	rqqd}t
|td}}
W5QRXt||||	||
S)zReturn swap memory metrics.rrrrs
SwapTotal:s	SwapFree:rz	%s/vmstatzP'sin' and 'sout' swap memory stats couldn't be determined and were set to 0 (%s)Nspswpin r#spswpoutzK'sin' and 'sout' swap memory stats couldn't be determined and were set to 0)rr
rvrrcextZ
linux_sysinforrstrrrrrrZsswap)rrrrrNrR_Zunit_multiplierrQrPerrrZsinZsoutr?r?r@swap_memorysF$
rc	Cs^t}t|td|}|}W5QRX|dttjd}dd|D}t|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.
    rrcSsg|]}t|tqSr?floatCLOCK_TICKSrr?r?r@r^szcpu_times.<locals>.<listcomp>)r
rrrrvrr_fields)rrrrr?r?r@	cpu_timesRsrc
Cst}t|g}td|l}||D]L}|dr,|}|dttjd}dd|D}t|}|	|q,|W5QRSQRXdS)zfReturn a list of namedtuple representing the CPU times
    for every CPU available on the system.
    rscpurcSsg|]}t|tqSr?rrr?r?r@rpsz!per_cpu_times.<locals>.<listcomp>N)
r
rrrrrvrrrr)rcpusrrrrentryr?r?r@
per_cpu_timesbs
rcCsztdWStk
rd}tdt&}|D]}|dr4|d7}q4W5QRX|dkrtd}t	dt0}|D]$}|
dd}||r|d7}qW5QRX|dkrYd	S|YSXd	S)
z0Return the number of logical CPUs in the system.SC_NPROCESSORS_ONLNr
%s/cpuinfos	processorrzcpu\drriN)rtsysconf
ValueErrorrr
lowerrrecompilerrvmatch)numrrsearchr?r?r@cpu_count_logicalvs$

rc
Cs
t}d}d}t|p t|D]*}t|}||W5QRXq"t|}|dkrb|Si}i}tdtv}|D]j}|}|sz|d||d<Wnt	k
rYnXi}q~|
dr~|dd	\}	}
t|
||	<q~W5QRXt
|}|pd
S)z2Return the number of physical 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_listrr	cpu coresphysical id)rrs	:rN)setglobraddrrrr
rrrrvrsumr)lsZp1Zp2r\rresultmappingZcurrent_inforkeyvaluer?r?r@cpu_count_physicals4

rc	Cstdt}d}d}d}|D]r}|dr@t|d}n6|dr\t|d}n|drvt|d}|dk	r |dk	r |dk	r qq W5QRXd}t||||S)z*Return various CPU stats as a named tuple.rNsctxtrsintrssoftirqr)rr
rrrvrZ	scpustats)rZctx_switchesZ
interruptsZsoft_interruptsrZsyscallsr?r?r@	cpu_statss,


rz'/sys/devices/system/cpu/cpufreq/policy0z$/sys/devices/system/cpu/cpu0/cpufreqcCsdd}g}ttD]}||}|s(qtjj}t||ddd}|dkrlt||ddd}|dkrltdt|d}tt||d	d}tt||d
d}|t	
|||q|S)zReturn frequency metrics for all CPUs.
        Contrarily to other OSes, Linux updates these values in
        real-time.
        cSs.d|d|fD]}tj|r|SqdS)Nz(/sys/devices/system/cpu/cpufreq/policy%sz%/sys/devices/system/cpu/cpu%s/cpufreq)rtr\exists)rpr?r?r@get_paths
zcpu_freq.<locals>.get_pathZscaling_cur_freqNrZcpuinfo_cur_freqz!can't find current frequency fileiZscaling_max_freqZscaling_min_freq)rangerrtr\rrNotImplementedErrorrrrscpufreq)rrnr\ZpjoinZcurrZmax_Zmin_r?r?r@cpu_freqs&rz
/proc/cpuinfoc	Csbg}tdtF}|D]:}|dr|dd\}}|tt|ddqW5QRX|S)z}Alternate implementation using /proc/cpuinfo.
        min and max frequencies are not available and are set to None.
        rscpu mhz:rr)	rr
rrrvrrrr)rrrrrr?r?r@rs$cCsgS)zGDummy implementation when none of the above files are present.
        r?r?r?r?r@rsc@seZdZdS)_Ipv6UnsupportedErrorN)r<r=r>r?r?r?r@rsrc@sZeZdZdZddZddZddZedd	ZedddZ	edd
dZ
dddZd
S)ConnectionsawA 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Csdtjtjf}dtjtjf}dtjtjf}dtjtjf}dtjdf}|||||f||f|f|f||f|f|f|f||||f||f||fd|_d|_dS)Ntcptcp6udpudp6unix)allrtcp4rrudp4rrinetZinet4Zinet6)socketAF_INETSOCK_STREAMAF_INET6Z
SOCK_DGRAMZAF_UNIXtmap_procfs_path)selfrrrrrr?r?r@__init__ s$

zConnections.__init__cCstt}td|j|fD]}ztd|j||f}WnRttfk
rTYqYqtk
r}z|j	t	j
krxWYqW5d}~XYqX|dr|dddd}|||t
|fq|S)N%s/%s/fd%s/%s/fd/%szsocket:[rr6)rlistrtlistdirr	rurr rrEINVALrrr)r
rinodesr]inoderr?r?r@get_proc_inodes7s
zConnections.get_proc_inodescCsHi}tD]8}z|||Wq
tttfk
r@Yq
Yq
Xq
|SN)pidsupdaterrr r)r
rrr?r?r@get_all_inodesMs
zConnections.get_all_inodesc	Cs|d\}}t|d}|s dStr.|d}|tjkrntrZt|t	|ddd}qt|t	|}nxt	|}zJtrttj
tjd	t
d|}n ttj
tjd
t
d|}Wn"tk
rtstnYnXt||S)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?asciiNr6>4I<4I)r)r)rvrr!encoderr
LITTLE_ENDIANZ	inet_ntopbase64Z	b16decoderstructpackunpackrrrraddr)r#familyZipZportr?r?r@decode_address]s4



zConnections.decode_addressNccs@|drtj|sdSt|td}|t|dD]\}}z(|dd\
}}	}
}}}}}}}Wn&t	k
rt
d|||fYnX||kr||d\}
}nd\}
}|dk	r||
krq<q<|tjkrt
|}ntj}zt|	|}	t|
|}
Wntk
rYq<YnX||||	|
||
fVq<W5QRXdS)	z.Parse /proc/net/tcp* and /proc/net/udp* files.6N	bufferingrrz,error while parsing %s; malformed line %s %rrNr6)rwrtr\rrBIGFILE_BUFFERINGr	enumeratervrRuntimeErrorrrTCP_STATUSESr	CONN_NONErr%r)filer$type_r
filter_pidrlinenorrladdrraddrstatusrrr]r?r?r@process_inets<



zConnections.process_inetc
cst|td}||D]}|}z|dd\}}}}}}}	Wn0tk
rtd|kr`Yqtd||fYnX|	|kr||	}
ndg}
|
D]b\}}|dk	r||krqqt|dkr|d	}
nd
}
tt	|}d
}tj
}||||
|||fVqqW5QRXdS)zParse /proc/net/unix files.r'rriz)error while parsing %s; malformed line %rr)Nrr6)rr*rrvrr,rrZsocktype_to_enumrr.)r/r$rr1rrtokensrr0rZpairsrr]r\r4r5r?r?r@process_unixs8


zConnections.process_unixcCs||jkr,td|ddd|jDft|_|dk	rP||}|sXgSn|}t}|j|D]\}}}d|j|f}|tj	tj
fkr|j|||||d}	n|j||||d}	|	D]L\}
}}}}}
}|rt
|
|||||
}nt
|
|||||
|}||qqht|S)Nz+invalid %r kind argument; choose between %srcSsg|]}t|qSr?)reprrr?r?r@rsz(Connections.retrieve.<locals>.<listcomp>z	%s/net/%s)r1)rrrr
r	rrrrrrr6r:rZpconnZsconnrr)r
kindrrrZ
proto_namer$r0r\rr]r3r4r5Z	bound_pidZconnr?r?r@retrievesL

zConnections.retrieve)N)N)N)r<r=r>__doc__rrrstaticmethodr%r6r:r=r?r?r?r@rs
2'%rrcCs
t|S)z$Return system-wide open connections.)_connectionsr=)r<r?r?r@net_connectionssrAcCstdt}|}W5QRXi}|ddD]x}|d}|d|}||dd}tt|\}}}	}
}}}
}}}}}}}}}|||||	||
|f||<q2|S)zsReturn network I/O statistics for every network interface
    installed on the system as a dict of raw tuples.
    z
%s/net/devr:Nrr)rr
	readlinesrfindrrvmapr)rlinesretdictrZcolonrrZ
bytes_recvZpackets_recvZerrinZdropinZfifoinZframeinZcompressedinZmulticastinZ
bytes_sentZpackets_sentZerroutZdropoutZfifooutZ
collisionsoutZ
carrieroutZ
compressedoutr?r?r@net_io_counterss>

rGc	Cstjttjttjti}t}i}|D]t}z&t	
|}t	|}t|\}}Wn0t
k
r}z|jtjkrrW5d}~XYq(Xt|||||||<q(|S)z)Get NIC stats (isup, duplex, speed, mtu).N)rZDUPLEX_FULLrZDUPLEX_HALFrZDUPLEX_UNKNOWNrrGkeys
cext_posixZ
net_if_mtuZnet_if_is_runningZnet_if_duplex_speedrrZENODEVrZ	snicstats)	Z
duplex_mapnamesrrZmtuZisupZduplexZspeedrr?r?r@net_if_stats+s$


rKFcCsdd}dd}tjdtr*|}n"tjdr>|}ntdti}|D]T}|\
}}}}	}
}}}
}}|s~t|s~qT|	t9}	|
t9}
|||	|
|||
||f	||<qT|S)zcReturn disk I/O statistics for every disk installed on the
    system as a dict of raw tuples.
    css0tdt}|}W5QRX|D]}|}t|}|dkr|d}t|d}tt|dd\
}}}	}
}}}
}}}n|dks|dkr|d}tt|dd\}}}}	}
}}}
}}}nN|dkr|d}tt|dd\}}}
}d	}	}
}}}ntd
||||
|||	|
|||f
Vq&dS)N%s/diskstatsr"r:r#r7rz!not sure how to interpret line %r)rr
rBrvrrrDr)rrErrZflenrreadsreads_mergedrbytesrtimewrites
writes_mergedwbyteswtimerrZr?r?r@read_procfsLsH

z%disk_io_counters.<locals>.read_procfscsstdD]}ttjd|D]\}}}d|kr6q"ttj|d}|}W5QRXtj	|}t
t|dd\
}}}	}
}}}
}}}||||	|
|
||||f
Vq"q
dS)N
/sys/blockstatr)rtrwalkr\rrrrrvbasenamerDr)blockrootrfilesrrrrPrQrRrSrTrUrVrWrZr?r?r@
read_sysfsws&z$disk_io_counters.<locals>.read_sysfsrLrYzC%s/diskstats nor /sys/block filesystem are available on this system)rtr\rr
rrDISK_SECTOR_SIZE)ZperdiskrXr`genrFrrrPrTrRrVrSrWrQrUrZr?r?r@disk_io_countersHs6+

rcc	Cst}t}td|R}|D]F}|}|dsD||q|dd}|dkr|dqW5QRX|dkrtj	drtj
d}ntj
d|}g}t|}|D]X}	|	\}
}}}|
d	krd
}
|s|
d
ks||krqd}
}t
|
||||
|}||q|S)z8Return mounted disk partitions as a list of namedtuples.z%s/filesystemsZnodev	rZzfsrz	/etc/mtabz%s/self/mountsZnoner8N)rr
rrrrrvrtr\isfilerealpathrdisk_partitionsrZ	sdiskpartr)rZfstypesrrrZfstypeZmounts_pathretlistZ
partitions	partitionZdeviceZ
mountpointZoptsZmaxfileZmaxpathntupler?r?r@rgs:

rgcCshtt}td}|tdttdd|D}td}td}|D]"}|	d|}||krR|
|qR|D]}z>|d}tt|d	}t
jt
j|d
}t|dd}	Wntttfk
rYqzYnXt|d
dd}
t|ddd}t|dddd}|
dk	rFzt|
d	}
Wntk
rDd}
YnX|dk	r|zt|d	}Wntk
rzd}YnX||	
|||
|fqz|s`td}tt|}|D]}z<t
j|d}tt|d	}t
j|d}t|dd}	WnDtttfk
r:}
ztd|
|fWYqW5d}
~
XYnXt|d}tdd|D}d}d}
|D]}t
j||d}t|ddd}|dkrtt
j||ddd}n$|dkrtt
j||ddd}
|
dk	rzt|
d	}
Wntk
r
d}
YnX|dk	rhzt|d	}Wntk
r@d}YnXqh||	
d||
|fqt|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*_*cSsg|]}|ddqSrrrvrr?r?r@rsz(sensors_temperatures.<locals>.<listcomp>z5/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*z'/sys/devices/platform/coretemp.*/hwmon/z/sys/class/hwmon/_inputg@@rFrZ_maxNrZ_crit_labelr8rrz /sys/class/thermal/thermal_zone*Ztemptypezignoring %r for file %rz/trip_point*cSs,g|]$}dtj|dddqS)rrr")rrtr\r\rv)rrr?r?r@r%sZ_typecriticalZ_temphigh)collectionsrrrextendsortedrrrsubrrrrtr\rdirnamerrrrdict)r	basenamesZ
basenames2replrZaltnamebaser\r	unit_namersrrlabelrZ
trip_pathsZtrip_pointsZ
trip_pointZ	trip_typer?r?r@sensors_temperaturess



	











rcCstt}td}|s"td}ttdd|D}|D]}ztt|d}Wn>tt	fk
r}zt
d|tWYq<W5d}~XYnXtt
jt
j|dd	d
}t|ddd	d
}||t||q<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*_*cSsg|]}|ddqSrkrlrr?r?r@rTsz sensors_fans.<locals>.<listcomp>rmzignoring %rNrFrnror8rp)rtrrrrvrrrrrrrrrtr\rrxrrZsfanry)rrzr|rrr}r~r?r?r@sensors_fansCs"



rcstfdd}ddttD}|s.dStjtt|d}||d|d}||d	|d
}||d|d}||d
}|dk	r|dk	rzd||}Wqtk
rd}YqXn tt	|ddd}|dkrdSd}|tjtdtjtd}	|	dk	r|	dk}n4t	|dddd
}
|
dkr>d}n|
dkrLd}|rZtj}nv|dk	r|dk	rzt||d}Wntk
rtj
}YnXn.|dk	rt|d}|dkrtj
}ntj
}t|||S)aReturn battery information.
    Implementation note: it appears /sys/class/power_supply/BAT0/
    directory structure may vary and provide files with the same
    meaning but under different names, see:
    https://github.com/giampaolo/psutil/issues/966
    cs:|D]0}t|d}|kr|r,t|n|SqdS)zvAttempt to read the content of multiple files which may
        not exist. If none of them exist return None.
        rN)risdigitr)pathsr\rZnullr?r@	multi_catls
z"sensors_battery.<locals>.multi_catcSs&g|]}|dsd|kr|qS)ZBATZbattery)rrrr?r?r@rvs
z#sensors_battery.<locals>.<listcomp>Nrz/energy_nowz/charge_nowz
/power_nowz/current_nowz/energy_fullz/charge_fullz/time_to_empty_nowgY@rz	/capacityr6rz
AC0/onlinez	AC/onlinerz/statusr8FrpZdischarging)ZchargingZfullTi<)objectrtrPOWER_SUPPLY_PATHr\rrvZeroDivisionErrorrrrrZPOWER_TIME_UNLIMITEDZPOWER_TIME_UNKNOWNZsbattery)rZbatsr^Z
energy_nowZ	power_nowZenergy_fullZ
time_to_emptyrPZ
power_pluggedZonliner5Zsecsleftr?rr@sensors_batterycsh






rc
Cs\g}t}|D]F}|\}}}}}}|s*q|dkr6d}t||pBd|||}	||	q|S)z:Return currently connected users as a list of namedtuples.)z:0.0z:0Z	localhostN)rusersrZsuserr)
rhZrawlistitemrlZttyZhostnameZtstampZuser_processrntr?r?r@rsrc
Csndt}t|R}|D]:}|drt|d}|a|W5QRSqtd|W5QRXdS)zAReturn the system boot time expressed in seconds since the epoch.rsbtimerzline 'btime' not found in %sN)r
rrrrrv	BOOT_TIMEr,)r\rrrr?r?r@	boot_times


rcCsddtttDS)z7Returns a list of PIDs currently running on the system.cSsg|]}|rt|qSr?)rrrr?r?r@rszpids.<locals>.<listcomp>)rtrrr
r?r?r?r@rsrc
Cst|sdSzpdt|f}t|P}|D]8}|dr,t|d}||kW5QRWSq,td|W5QRXWn"ttfk
r|t	kYSXdS)zcCheck for the existence of a unix PID. Linux TIDs are not
    supported (always return False).
    F%s/%s/statussTgid:rz'Tgid' line not found in %sN)
r
pid_existsr
rrrrvrEnvironmentErrorr)rr\rrZtgidr?r?r@rs



rc
Csi}t}tD]x}z(td||f}|}W5QRXWnttfk
rTYqX|d}||dd}t|d}|||<q|S)zsObtain a {pid: ppid, ...} dict for all running processes in
    one shot. Used to speed up Process.children().
    
%s/%s/stat)r:Nr)	r
rrrrr rCrvr)rrrrdatarparZdsetppidr?r?r@ppid_maps


rcstfdd}|S)zlDecorator which translates bare OSError and IOError exceptions
    into NoSuchProcess and AccessDenied.
    csz|f||WStk
r4t|j|jYn\tk
rTt|j|jYn<tk
rtj	d|j
|jfst|j|jYnXdS)N%s/%s)rr
r_namer rrrtr\rr	)r
argskwargsfunr?r@wrapper%sz wrap_exceptions.<locals>.wrapper)	functoolswraps)rrr?rr@wrap_exceptions!s
rc@steZdZdZdddddgZddZd	d
ZeeddZ	eed
dZ
eeddZddZddZ
eddZddZeddZeddZeddZejdered d!Zed"d#Zed$d%Zed`d'd(Zed)d*Zed+d,Zer.eed-ed.ed/fd0d1Z neZ erDed2d3Z!ed4d5Z"eed6fd7d8Z#eed9fd:d;Z$ed<d=Z%ed>d?Z&ed@dAZ'e(redBdCZ)edDfdEdFZ*edGdHZ+e,redIdJZ-edKdLZ.e/d&k	redadMdNZ0edOdPZ1edQdRZ2edbdTdUZ3edVdWZ4edXdYZ5eedZfd[d\Z6eed]fd^d_Z7d&S)cProcesszLinux process implementation.rr_ppidr	_cachecCs||_d|_d|_t|_dSr)rrrr
r	)r
rr?r?r@r;szProcess.__init__cCstd|j|jfdS)z+Raise NSP if the process disappeared on us.rN)rtrZr	rr
r?r?r@
_assert_aliveAszProcess._assert_alivec	Cstd|j|jf}|}W5QRX|d}||dd|}||dd}i}||d<|d|d	<|d|d
<|d|d<|d
|d<|d|d<|d|d<|d|d<|d|d<|d|d<|d|d<|S)aZParse /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 substract 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.
        rr(rr:Nrrr5rr#ttynrutimestime
children_utimerNchildren_stimecreate_time$cpu_num'blkio_ticks)rr	rrrCfindrv)r
rrrrrrr?r?r@_parse_stat_fileGs$
zProcess._parse_stat_filec
Cs4td|j|jf}|W5QRSQRXdS)zRead /proc/{pid}/stat file and return its content.
        The return value is cached in case oneshot() ctx manager is
        in use.
        rN)rr	rrr
rr?r?r@_read_status_filejszProcess._read_status_filec
Cs<td|j|jftd}|W5QRSQRXdS)Nz%s/%s/smapsr')rr	rr*rrrr?r?r@_read_smaps_filets
zProcess._read_smaps_filecCs(|j||j||j|dSr)rZcache_activaterrrr?r?r@
oneshot_enter{szProcess.oneshot_entercCs(|j||j||j|dSr)rZcache_deactivaterrrr?r?r@oneshot_exitszProcess.oneshot_exitcCs|d}trt|}|S)Nr)rr!r)r
rr?r?r@rszProcess.namec	Csztd|j|jfWSttfk
rxtjd|j|jfrHYdSt|jsbt	|j|j
nt|j|j
|jYn"t
k
rt|j|j
YnXdS)Nz	%s/%s/exerr8)rur	rrr rtr\lexistsrrrrrrr
rr?r?r@exes
zProcess.exec	Cstd|j|jf}|}W5QRX|s0gS|dr>dnd}||rX|dd}||}|dkrt|dkrd|kr|d}|S)Nz
%s/%s/cmdlinerqrir6r)rr	rrrwrvr)r
rrsepcmdliner?r?r@rs


zProcess.cmdlinec	Cs0td|j|jf}|}W5QRXt|S)Nz
%s/%s/environ)rr	rrr)r
rrr?r?r@environszProcess.environcCs>t|d}t}z
||WStk
r8YdSXdS)Nr)rrrZget_terminal_mapr)r
Ztty_nrrr?r?r@terminals
zProcess.terminalz/proc/%s/ioc
Csd|j|jf}i}t|T}|D]H}|}|r"z|d\}}Wntk
r\Yq"Yq"Xt|||<q"W5QRX|std|z,t|d|d|d|d|d|d	WSt	k
r}ztd
|d||fW5d}~XYnXdS)Nz%s/%s/ios: z%s file was emptyssyscrssyscws
read_bytesswrite_bytessrcharswcharz1%r field was not found in %s; found fields are %rr)
r	rrrrvrrr,rjr)r
rrrrrrrr?r?r@io_counterss4

zProcess.io_counterscCsh|}t|dt}t|dt}t|dt}t|dt}t|dt}t|||||S)Nrrrrr)rrrrk)r
rrrrrrpr?r?r@rszProcess.cpu_timescCst|dS)zWhat CPU the process is on.rrrrr?r?r@rszProcess.cpu_numNcCst|j||jSr)rZwait_pidrr)r
Ztimeoutr?r?r@waitszProcess.waitcCs&t|d}tpt}|t|S)Nr)rrrrr)r
ctimeZbtr?r?r@rs
zProcess.create_timec		Cs`td|j|jf2}dd|ddD\}}}}}}}W5QRXt|||||||S)Nz%s/%s/statmcSsg|]}t|tqSr?)rrrr?r?r@rsz'Process.memory_info.<locals>.<listcomp>r7)rr	rrrvr`)	r
rZvmsrfrWtextlibrZdirtyr?r?r@memory_infos
zProcess.memory_infos\nPrivate.*:\s+(\d+)s\nPss\:\s+(\d+)s\nSwap\:\s+(\d+)c	Csj|}|}ttt||d}ttt||d}ttt||d}t||||fS)Nr)rrrrDrfindallra)	r
Z_private_reZ_pss_reZ_swap_reZ	basic_memZ
smaps_datarbrcrdr?r?r@memory_full_infos
zProcess.memory_full_infocCsTdd}|}|sgS|d}g}|d}|g}|||D]\}}|dd}z|\}	}
}}}
}Wn*tk
r|dg\}	}
}}}
}YnX|sd}n2trt|}|}|d	rt|s|dd
}|	t|	t|
||
dd|
dd|
d
d|
dd|
dd|
dd|
dd|
dd|
dd|
ddf
q@|S)aPReturn process's mapped memory regions as a list of named
            tuples. Fields are explained in 'man proc'; here is an updated
            (Apr 2012) version: http://goo.gl/fmebo

            /proc/{PID}/smaps does not exist on kernels < 2.6.14 or if
            CONFIG_MMU kernel configuration option is not enabled.
            c	ssi}|D]}|dd}|dds@||fV||qzt|dd||d<Wqtk
r|ddrYqntd|YqXq||fVdS)NrrrrsVmFlags:z#don't know how to interpret line %r)rvrwpoprrrr)rE
current_blockrrrr?r?r@
get_blocksEsz'Process.memory_maps.<locals>.get_blocks
rNrr8z[anon]rrrssRss:sSize:sPss:s
Shared_Clean:s
Shared_Dirty:sPrivate_Clean:sPrivate_Dirty:sReferenced:s
Anonymous:sSwap:)rrvrrr!rrrwrrr)r
rrrErZ
first_linerheaderZhfieldsr#ZpermsoffsetZdevrr\r?r?r@memory_maps<sP	













zProcess.memory_mapsc	Cs`ztd|j|jfWSttfk
rZt|jsDt|j|jnt|j|j|j	YnXdS)Nz	%s/%s/cwd)
rur	rrr rrrrrrr?r?r@cwds
zProcess.cwdsctxt_switches:\t(\d+)cCsL|}||}|s,td|j|jfntt|dt|dSdS)Nz'voluntary_ctxt_switches' and 'nonvoluntary_ctxt_switches'lines were not found in %s/%s/status; the kernel is probably older than 2.6.23rr)rrrr	rrZpctxswr)r
Z	_ctxsw_rerZctxswr?r?r@num_ctx_switchess
zProcess.num_ctx_switchessThreads:\t(\d+)cCs|}t||dSNr)rrr)r
Z_num_threads_rerr?r?r@num_threadsszProcess.num_threadsc
Cstd|j|jf}|g}d}|D]}d|j|j|f}z$t|}|}W5QRXWntk
rd}Yq*YnX||	ddd}|
d}t|dt}	t|d	t}
t
t||	|
}||q*|r||S)
Nz
%s/%s/taskFz%s/%s/task/%s/statTrr:rrr)rtrr	rsortrrrrrrvrrrZpthreadrrr)r
Z
thread_idsrh
hit_enoentZ	thread_idrrstrrrrjr?r?r@threadss2


zProcess.threadscCst|jSr)rIgetpriorityrrr?r?r@nice_getszProcess.nice_getcCst|j|Sr)rIsetpriorityr)r
rr?r?r@nice_setszProcess.nice_setcCst|jSr)rr4rrr?r?r@cpu_affinity_getszProcess.cpu_affinity_getsCpus_allowed_list:\t(\d+)-(\d+)cCsV|}||}|r@ttt|ddt|dddSttttSdS)Nrr)rrrrrrr)r
Z_rerrr?r?r@_get_eligible_cpuss

*zProcess._get_eligible_cpusc
Cszt|j|Wnttfk
r}zpt|ts>|jtjkr|}t	t
tt}|D]4}||krxtd||f||kr\td||fq\W5d}~XYnXdS)Nz(invalid CPU number %r; choose between %sz0CPU number %r is not eligible; choose between %s)
rZproc_cpu_affinity_setrrr
isinstancerrrtuplerrr)r
rrZ
eligible_cpusZall_cpusZcpur?r?r@cpu_affinity_sets*zProcess.cpu_affinity_setcCs,t|j\}}tdk	r t|}t||Sr)rr3renumr;rZpionicer
Zioclassrr?r?r@
ionice_getszProcess.ionice_getcCsP|dkrd}|r(|ttfkr(td||dks8|dkr@tdt|j||S)Nrz%r ioclass accepts no valuer7zvalue not in 0-7 range)r'r$rrZproc_ioprio_setrrr?r?r@
ionice_setszProcess.ionice_setc
Cs|jdkrtdzD|dkr*t|j|WSt|dkrFtdt|t|j||WnNtk
r}z0|jtjkrt|jrt	|j|j
|jnW5d}~XYnXdS)Nrz)can't use prlimit() against PID 0 processr:z4second argument must be a (soft, hard) tuple, got %s)rrrrr;rrZENOSYSrrrr)r
rrrr?r?r@rlimits 
zProcess.rlimitcCs$|d}tr|}t|dS)Nr5?)rr!r
PROC_STATUSESr)r
Zletterr?r?r@r5szProcess.statusc
Cs^g}td|j|jf}d}|D]&}d|j|j|f}zt|}WnVttfk
rfd}Yq"Yq"tk
r}z|jtj	krWYq"W5d}~XYq"X|
dr"t|r"d|j|j|f}zBt|0}t
|d}	t
|dd}
W5QRXWntk
rd}Yq"Xt|
}t|t
|t
|	||
}||q"|rZ||S)	NrFr
Trz%s/%s/fdinfo/%srr)rtrr	rrurr rrrrrrrrrvrr[rr)
r
rhr_rr]r/r\rrposr_r^rjr?r?r@
open_files&sL

$
zProcess.open_filesrcCst||j}||Sr)r@r=rr)r
r<rr?r?r@connectionsRszProcess.connectionscCsttd|j|jfS)Nr)rrtrr	rrr?r?r@num_fdsXszProcess.num_fdscCst|dS)Nrrrr?r?r@r\szProcess.ppidsUid:\t(\d+)\t(\d+)\t(\d+)cCs6|}||d\}}}tt|t|t|Sr)rrrZpuidsr)r
Z_uids_rerreal	effectivesavedr?r?r@uids`szProcess.uidssGid:\t(\d+)\t(\d+)\t(\d+)cCs6|}||d\}}}tt|t|t|Sr)rrrZpgidsr)r
Z_gids_rerrrrr?r?r@gidsfszProcess.gids)N)N)r)8r<r=r>r>	__slots__rrrrrrrrrrrrrrrtr\rgetpidrrrrrr	HAS_SMAPSrrrrrrrrrrHAS_CPU_AFFINITYrrrHAS_PROC_IO_PRIORITYrrrrr5rrrrrrr?r?r?r@r6s!



	

	




C











	


+

r)N)r)F)F)r>Z
__future__rrrtrrrrtrrr sys	tracebackrrrr8rrrrr	rIr
rrr
rrrrrrrrrrrrrrZ_compatrrrrr r!version_inforZ__extra__all__rr\rrrhasattrrrrrrrZgetpagesizerrr*	byteorderrraZ	AF_PACKETr9IntEnumrr8r$r%r&r'r;globalsr__members__ZSTATUS_RUNNINGZSTATUS_SLEEPINGZSTATUS_DISK_SLEEPZSTATUS_STOPPEDZSTATUS_TRACING_STOPZ
STATUS_ZOMBIEZSTATUS_DEADZSTATUS_WAKE_KILLZ
STATUS_WAKINGZSTATUS_IDLEZ
STATUS_PARKEDrr(r)r*r+r,r-r.r/r0r1r2r-rMrYr[r`rrarerrhrjrkrurrrr	Exception	print_excrrresourceImportErrorrZCDLLrrudirrrrrrrrrrZnet_if_addrsrrr@rArGrKZ
disk_usagercrgrrrrrrrrrrr?r?r?r@<module>s














	4z:*

 

k
%
_
+q ^ 
Back to Directory File Manager